Git
i
Conceptos
Repositorio, repository
Conjunto de ficheros, ramas, referencias...
Repositorio local
Aquél que utiliza normalmente un usuario. En algunos comandos se denota por
'.'
Repositorio remoto
Repositorio no local, p.e. aquél del que se copió el local
origin
Referencia al repositorio remoto origen del local
Revisión, parche, commit
Conjunto de ficheros en un estado dado que se guarda en el repositorio local
git guarda fotos (snapshots) de ficheros; subversion guarda deltas.
Commit ID
Identificador hexadecimal único
1
Rama
Lista de commits secuenciales
Rama local
Rama en repositorio local
Rama remota
Rama en repositorio remoto que se observa desde el repositorio local
Rama master, master branch
Rama en que se guarda la versión más estable
Rama de tópico, topic branch
Rama temporal para trabajar un aspecto concreto
Árbol de trabajo, working tree
Checkout de una rama local
Rama actual, current branch
Rama local que está en el árbol de trabajo
2
Cabeza de rama, branch head, cabeza, head
Último commit
HEAD
Cabeza de la rama actual
HEAD^ HEAD~1: penúltimo cambio guardado, parent head
HEAD~2 HEAD^^, HEAD~3 HEAD^^^, ...: antepenúltimo, ...
3
Repositorio
Operación
Crear
Desde cero
Desde ficheros
desde repo remoto
Comando
mkdir prj
cd prj
git init [--shared] (1)
cd prj
git init
git add .
git clone <repo> [<new_dir>]
1. --shared: si vamos a permitir que otros usuarios escriban en el repositorio
<repo>:
http://host/ruta/absoluta
ssh://host/ruta/absoluta
4
file:///ruta/absoluta, /ruta/absoluta
5
Repositorio: configuración
.git/config
[user]
name = Juan Español
email =
[email protected]
[color]
branch = auto
diff = auto
status = auto
.gitignore
Ficheros no sometidos a control de versiones
*.gif
*.config
6
Ficheros
Operación
Meter en git
Guardar
diff con rama actual
Ver lista cambios
Autor de los cambios
Descartar modificaciones
Comando
git add <file>...
git commit [-m '...'] <file>...
git diff [<commit>] <file> (1)
git log <file>
git blame [<commit>] <file>
git checkout [<commit>] <file>... (2)
1. <commit>: por defecto HEAD
2. <commit>: sobreescribir con la versión de un commit dado; por defecto HEAD
7
Árbol de trabajo
Operación
Comando
Descartar cambios
diff con otra rama
git reset --hard
git diff <rama>
8
Revisiones
Operación
Crear
Listar
Mostrar
Todo pendiente
Ficheros
Respecto a w.t.
Comando
git commit -a [-m '...']
git commit <file>...
git log [<file>...]
git show <commit>
git diff <commit>
git commit --amend [<file>...]
git revert <commit>
Corregir (1)
Revertir (2)
-m: comentario
1. No hacerlo si se ha propagado a ramas remotas
2. Puede propagarse
9
Etiquetas
Una etiqueta es un nombre simbólico asignado a un commit, un alias.
Utilidad:
identificar hitos de desarrollo
indentificar versiones entregadas a cliente
Operación
Comando
Crear
Listar
Eliminar
Renombrar
Commit de tag
git tag <tag> [<commit>]
git tag -l
git tag -d <tag>
git tag <old_tag> <new_tag>; git tag -d <old_tag>
git rev-parse <tag>
10
Ramas
Un diseño típico de ramas de un repositorio puede ser
rama master, con el código más estable
ramas de tópico o feature, para desarrollar funcionalidades
ramas de corrección de bugs
desde cero
desde rama actual
desde otra rama
Operación
Creación
Listar
Establecer actual
Renombrar
Eliminar
Comando
git checkout -b <new_branch>
git branch <new_branch> [<commit>] (1)
git branch <new_branch> <branch> (2)
git branch [-r] [-a] (3)
git checkout <branch>
git -m [<branch>] <new_branch> (4)
git branch -d <branch> (5)
11
1. <commit>: HEAD de la nueva rama
2. <branch>: local o remota
3. por defecto: ramas locales
-r: ramas remotas
-a: todas
4. <branch>: por defecto la actual
5. la rama actual debe ser otra
12
Conceptos
Veamos un elemento que no aparecía en sistemas más tradicionales
Index, index file
Conjunto de cambios para el próximo commit
¿Cómo afecta este elemento a las operaciones vistas?
ficheros
index
revisiones
stash
13
Ficheros
Operación
Añadir a git
Renombrar
Eliminar de w.t. e index
Recursivamente
Comando
git add <file>...
git add <dir>
git mv <file> <new_file> (1)
git rm <file> (1)
1. la operación queda en el index
14
Index
Operación
Comando
Añadir fichero
Listar
Eliminar fichero
diff index - commit
diff w.t. - index
Guardar
<commit>: por defecto HEAD
git add <file>...
git status
git reset HEAD <file>...
git diff --cached [<commit>] [<file>...]
git diff [<file>...]
git commit
15
Revisión
Operación
Deshacer (1)
descarta index
deja cambios en index
reset ambos a nuevo HEAD (2)
Comando
git reset [--mixed] [<commit>]
git reset --soft [<commit>]
git reset --hard [<commit>]
(1) cambiamos el commit referenciado por HEAD <commit>: por defecto HEAD
Warning
2. ¡los commit y modificaciones posteriores al nuevo HEAD se pierden!
16
Stash
git tiene un array de portapapeles al que mover modificaciones en w.t. e index
gestionar interrupciones
Operaciones
Mover cambios en w.t. e index
Listar
Mostrar
Aplicar a rama actual
" y descartar
Descartar
Comando
git stash [save [<comment>]]
git stash list
git stash show [<stash>]
git stash apply [--index] [<stash>] (1)
git stash pop [<stash>]
todos git stash clear
uno
git stash drop [<stash>]
<stash>: índice en la lista. Por defecto 0
1. --index: restaurar también el index
17
Merge
Vamos a juntar el trabajo hecho en distintas ramas.
Prerrequisitos
index y w.t. deben estar limpios (1)
git diff --cached: Ø
git status: no hay ficheros modificados
activar la rama destino como rama actual
git merge <branch>
también, git pull . <branch>
1. estrictamente, de los ficheros distintos a HEAD que lleguen
18
merge: resolución de problemas
Árbol sucio
"error: Entry '_<file>' not uptodate. Cannot merge."
Árbol de trabajo sucio
Guardar cambios o descartarlos, repetir merge
Conflicto de contenido
"CONFLICT (content): Merge conflict in <file>"
Un fichero tiene segmentos incompatibles en cada rama
Editar fichero y hacer commit
Síntoma
Causa
Solución
Síntoma
Causa
Solución
>>>>>>>
a
-------
b
<<<<<<<
19
Warning
Probar el programa, la ausencia de conflictos no garantiza corrección
20
Trabajar con repositorios remotos
Comando
Operación
Actualiza repositorio remoto
Añadir ref. a repositorio remoto
todas las
ramas
algunas
ramas
git push [<remote>] [<branch>]
git remote add <remote> <repo> (1)
git remote add <remote> <repo> -t
<branch>
git fetch [<remote>]
Actualizar copia local de rep.
remoto
Mezclar rama remota con actual
Actualizar y mezclar "
<remote>: por defecto origin
1. <remote>: nombre con el que se va a referenciar el repositorio remoto
2. P.e., alpha/master, level1/drivers
git merge <remote>/<branch> (2)
git pull [<remote>] <branch>
21
push: problemas
Rama local no actualizada
Síntoma
Causa
Solución
"! [rejected] <branch> -> <branch> (non-fast forward)"
La rama remote no es descendiente directo de la actual
pull; push
22
Reescribir la historia
Se pueden "trasplantar ramas" por el árbol de commits.
git rebase [--onto <newbase>] <upstream> [<branch>]
Git va a intentar aplicar en secuencia, a partir de <newbase>, los commits
<upstream>..HEAD (cambios en la rama actual que no están en la rama de
<upstream>)
<newbase>: punto al que trasplantar la rama; por defecto <upstream>
<branch>: rama en la que hacer el rebase mediante un checkout inicial; por
defecto la actual
Pueden producirse conflictos de merge
23
resolver y dejar la solución en el index; git rebase --continue
o saltarse el commit problemático: git rebase --skip
o abortar la operación: git rebase --abort
Utilidad
simplificar el árbol
actualizar frecuentemente una rama de tópico con el origin para que no
diverja mucho y los conflictos se revelen y resuelvan pronto
git fetch origin master
git rebase origin/master
rebase interactivo
Como preparación para propagar cambios a otras ramas, puede ser
conveniente editarlos interactivamete
git rebase -i <upstream>
24
Se mueven los commits <upstream>..HEAD a una agenda temporal que
podemos manipular
Operación
Reordenar commits
Unir con anterior
Descartar commit
Aplicar hasta commit
... continuar
Tratar conflicto
Abortar
Utilidad
reordenar las líneas
1ra palabra: squash
Borrar su línea
1ra palabra: edit
git rebase --continue
Dejar solución en index; git rebase --continue
o bien, git rebase --skip
git rebase --abort
consolidar una rama de bug en un solo parche
diseñar commits significativo en una rama de tópico
25
Propagar cambios selectivamente
git fetch [<remote>]
git log ..<remote>/<branch>
git cherry-pick <commit>
Es importante tratar de que los parches sean
funcionalmente significativos
independientes.
26
Flujo de trabajo
git permite una enorme variedad de estilos de trabajo: centralizado, distribuido,
tradicional, ágil...
Un posible flujo de trabajo podría ser:
pull para actualizar master local
checkout rama de tópico
probar el desarrollo y guardar commits con frecuencia
rebase frecuente de origin/master, probar
rebase interactivo para ordenar el trabajo, probar
merge en rama maestra, probar
propagar hacia arriba: git push origin master
Si se está corrigiendo un bug, el workflow puede ser muy parecido
crear rama "bug-<n>"
27
seguir el mismo workflow
preparar un único commit
PROBAR el código es importante porque
los conflictos pueden resolverse mal
aunque no haya conflictos la mezcla puede no tener sentido como programa
de ordenador
28
Otros temas
parches
.git/hooks
pre
Comentarios de: Git (0)
No hay comentarios