Introducción al uso de
(Creative Commons Attribution Non-commercial Share Alike 3.0 Spain License)
Iñaki Arenaza
[email protected]
@iarenaza
Sistemas de Control de Versiones
Centralizados (CVCS)
Ejemplos: CVS, Subversion, Perforce, SourceSafe, ...
Fuente: http://progit.org/book/ch1-1.html (CC-BY-NC-SA 3.0)
2
Sistemas de Control de Versiones
Distribuidos (DVCS)
Ejemplos: git, Mercurial, Bazaar, BitKeeper,...
Fuente: http://progit.org/book/ch1-1.html (CC-BY-NC-SA 3.0)
3
Diferencias versus instantáneas
Bazaar,
Mercurial*
Fuente: http://progit.org/book/ch1-3.html (CC-BY-NC-SA 3.0)
git,
Mercurial*
Fuente: http://progit.org/book/ch1-3.html (CC-BY-NC-SA 3.0)
4
(Algunas) características de git
(Casi) todas las operaciones son locales
Git tiene integridad fuerte (sha1)
Git (generalmente) sólo añade datos
5
Los tres espacios y tres estados
Fuente: http://progit.org/book/ch1-3.html
(CC-BY-NC-SA 3.0)
Modified*
Staged
Committed
6
Los tres espacios
El directorio (repositorio) es donde git
almacena los metadatos y la base de datos
de objetos para tu proyecto.
El directorio de trabajo es una copia de
trabajo de una versión del proyecto.
El área de preparación (staging area) es un
archivo que almacena información sobre lo
que irá en el próximo commit. Antes se le
llamaba “el índice”.
7
Los tres estados
Confirmado/no modificado (committed): los
datos están almacenados de manera
segura en el directorio.
Modificado (modified): se ha modificado el
archivo pero todavía no se ha confirmado.
Preparado (staged): se ha marcado para
confirmación un archivo modificado en su
versión actual.
8
Los “tres + 1” estados
El estado
3+1
Fuente: http://progit.org/book/ch2-2.html (CC-BY-NC-SA 3.0)
9
Terminología de git
En los ejemplos siguientes $GIT_DIR
contiene la ruta de un repositorio git dado
objeto: unidad de almacenamiento en git.
Se identifica de forma unívoca por el SHA1 de su
contenido.
Por tanto, un objeto es inmutable.
10
Tipos de objetos de git
blob: objeto sin tipo, para guardar el
contenido de un fichero. “Un fichero”.
tree: lista de nombres y permisos, junto con
las referencias de objetos blob o tree
asociados. “Un directorio”.
11
Tipos de objetos de git
commit: información de una revisión dada.
Incluye:
los padres del objeto,
la persona que ha realizado el commit de la
revisión,
el autor de la revisión,
la fecha de la misma,
un mensaje asociado,
el objeto tree que corresponde al directorio raíz de
la revisión.
12
Tipos de objetos de git
tag: identifica de forma simbólica a otros
objetos y puede ser usado para firmar
éstos. Contiene:
el nombre y tipo de otro objeto,
un nombre simbólico (el de la propia tag)
puede contener un mensaje asociado.
opcionalmente puede incluir una firma (PGP). En
este último caso se denomina un "objeto de
etiqueta firmada".
13
Terminología de git (cont.)
nombre de objeto o identificador de objeto:
identificador único del objeto (de 40 bytes con
la representación hexadecimal del SHA1 de su contenido)
base de datos de objetos: almacena un
conjunto de objetos (habitualmente en
$GIT_DIR/objects/).
ref o referencia: cadena de 40 bytes con la
representación hexadecimal de un SHA1, o
un nombre simbólico (que se almacena en
$GIT_DIR/refs/) que denota un objeto
particular.
14
Terminología de git (cont.)
revisión: estado concreto de una serie de
ficheros y directorios que ha sido
almacenado en la base de datos de
objetos. Se hace referencia a él por medio
de un objeto commit.
padre: un objeto commit contiene una lista
(potencialmente vacía) de objetos commit
que representan a sus predecesores lógicos
en la línea de desarrollo, esto es, sus
ancestros.
15
Tipos de objetos de git
Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0)
16
Tipos de objetos de git
Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0)
17
Terminología de git (cont.)
repositorio: colección de referencias junto
con una base de datos de objetos tiene
todos los objetos que son alcanzables
desde dichas referencias.:
Puede contener además algunos meta datos
adicionales usados por determinas órdenes de git.
Puede contenier una copia de trabajo de una
revisión.
repositorio desnudo (bare): repositorio que
no tiene una copia de trabajo.
Los de control de git que normalmente estarían
presentes en el subdirectorio oculto .git están
presentes en el propio directorio del repositorio.
18
Terminología de git (cont.)
árbol de trabajo o copia de trabajo: Una
revisión extraida del repositorio, para poder
trabajar con ella.
índice: una colección de ficheros con
información de stat(2), cuyos contenidos
están almacenados como objetos.
El índice es una versión almacenada del árbol de
trabajo.
19
Terminología de git (cont.)
rama: línea activa de desarrollo.
El commit más reciente de una rama se denomina
la punta de dicha rama. La punta de la rama se
referencia por medio de una cabeza.
La copia de trabajo está siempre asociada a una
rama (la rama "actual" o "checked out") y la
cabeza especial “HEAD” apunta a esa rama.
cabeza: una referencia con nombre, que
apunta al objeto commit de la punta de una
rama.
Las cabezas se almacenan en $GIT_DIR/refs/heads/,
(salvo que se usen referencias empaquetadas).
20
Terminología de git (cont.)
checkout: acción de actualizar parte o todo
el árbol de trabajo con un objeto árbol o
blob desde la base de datos de objeto
Además actualiza el índice y la referencia HEAD si
se ha cambiado de rama.
21
Terminología de git (cont.)
1
Estado “inicial”
2
$ git branch testing
3
master sigue siendo
la rama activa en la
copia de trabajo
4
$ git checkout testing
testing pasa a ser la
rama activa en la
copia de trabajo
Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0)
22
Terminología de git (cont.)
2
$ git add some-file(s)
$ git commit -m ...
$ git checkout master
1
3
$ git add some-file(s)
$ git commit -m ...
Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0)
23
Terminología de git (cont.)
merge: fusionar los contenidos de otra
rama (potencialmente desde un repositorio
externo) en la rama actual.
Si la rama es de otro repositorio, primero se hace
un fetch* de la rama y después se fusiona en la
rama actual.
La fusión puede crear un nuevo objeto commit si
una de las ramas no es un ancestro de la otra.
Si una es ancestro de la otra, simplemente se
mueve la referencia de la cabeza de la rama
fusionada (fast-forward merge).
24
merge: escenario 1
2
$ git branch hotfix master
$ git checkout hotfix
$ git add ….
$ git commit
1
3
$ git checkout master
$ git merge hotfix
Fuente: http://progit.org/book/ch3-2.html (CC-BY-NC-SA 3.0)
25
merge: escenario 2
1
3
$ git checkout -b iss53 master
$ git add ….
$ git commit
$ git checkout master
$ git add ….
$ git commit
2
$ git merge iss53
Fuente: http://progit.org/book/ch3-2.html (CC-BY-NC-SA 3.0)
26
$ git branch mdl21-nested-groups mdl21-ldap-refactor
Operaciones en el área de trabajo
Crear nuevas ramas locales (ultra rápido
y baratísimo en disco):
Extraer una rama al área de trabajo:
Consultar la rama activa:
Mostrar el estado del área de trabajo:
Marcar cambios para commit:
$ git checkout mdl21-nested-groups
$ git branch
$ git status
$ git add fichero1 fichero2 ...
$ git rm fichero3 fichero4 ...
27
Operaciones en el área de trabajo
Mostrar diferencias con el índice o con HEAD:
$ git diff
$ git diff HEAD
Mostrar diferencias con otras ramas:
$ git commit
$ git diff MOODLE_21_STABLE
$ git diff MOODLE_21_STABLE..mdl21-ldap-refactor
Hacer commit de los cambios (marcados):
Usar gitk para visualizar el historial de una rama:
Usar gitk para visualizar el historial de todas las
ramas:
$ gitk mdl21-nested-group
$ gitk --all
28
Terminología de git (cont.)
clone: obtener una copia local completa* de un
repositorio git remoto.
* las cabezas de
las ramas remotas
son inamovibles**
Fuente: http://progit.org/book/ch3-5.html (CC-BY-NC-SA 3.0)
29
Terminología de git (cont.)
fetch: obtener la cabeza de una rama (o
varias) desde un repositorio remoto,
copiando los objetos falten y moviendo
la(s) cabeza(s) remota(s).
1
2
Fuente: http://progit.org/book/ch3-5.html (CC-BY-NC-SA 3.0)
30
Terminología de git (cont.)
pull: hacer un fetch seguido de un merge,
con una rama remota dada.
push: enviar los objetos de la rama local
que no están en la rama remota a la que
hace referencia el pull, y actualizar la
cabeza de la rama remota.
Es la acción complementaria de pull.
Si la cabeza de la rama remota no es un ancestro
de la cabeza de la rama local, el push falla*.
31
Operaciones en el área de trabajo
Clonar un repositorio “remoto”:
$ git clone git://git.moodle.org/moodle.git
$ git clone ssh://
[email protected]/moodle.git
$ git clone http://git.moodle.org/moodle.git
$ git clone
[email protected]:iarenaza/moodle.git
$ git clone /ruta/a/moodle.git /ruta/a/otro-moodle.git
$ git clone -o moodle.git
[email protected]:iarenaza/moodle.git
32
Operaciones en el área de trabajo
Incorporar nueva rama del repositorio remoto
al repositorio local:
$ git fetch moodle.git
$ git branch mdl21-enrol-database-refactor \
moodle.git/mdl21-enrol-database-refactor
Enviar ramas locales al repositorio remoto:
$ git push moodle.git mdl21-nested-groups
$ git push moodle.git +mdl21-nested-groups
$ git push moodle.git mdl21-nested-groups:mdl21-nestgrp
Configurar rama para poder hacer pull desde
repositorio remoto:
$ git config branch.mdl21-nested-groups.remote \
moodle.git
$ git config branch.mdl21-nested-groups.merge \
refs/heads/mdl21-nested-groups
33
Terminología de git (cont.)
rebase: re-aplicar una serie de cambios
desde una rama en la cabeza de otra rama
diferente, y hacer que la cabeza de esa
otra rama apunte al resultado.
¡OJO! Rescribe el historial de la rama.
Puede ser problemático en ramas publicadas en
repositorios rem
Comentarios de: Introducción al uso de Git (0)
No hay comentarios