PDF de programación - Git

Imágen de pdf Git

Gitgráfica de visualizaciones

Publicado el 14 de Enero del 2017
695 visualizaciones desde el 14 de Enero del 2017
127,3 KB
32 paginas
Creado hace 13a (10/11/2010)
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
  • Links de descarga
http://lwp-l.com/pdf66

Comentarios de: Git (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad