Charla presentada en la reunión quincenal de NSCoder Night Madrid.
En esta charla hemos revisado las principales herramientas que git nos da para solucionar conflictos. En las diapositivas y en los ejemplos nos hemos centrado en cómo resolverlos después de hacer un merge.
1. Resolviendo conflictos
con git
Alfonso Alba García
@aprendegit
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
2. Conflictos
• git es muy bueno incorporando el código
de una rama en otra
• Aún así, milagros no hace
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
3. ¿Cuándo ocurren los
conflictos?
• Cuando intentamos incorporar las
modificaciones de un commit en otro
• ¿Y cuándo ocurre eso?
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
4. ¿Cuándo ocurren los
conflictos?
• merge
• rebase
• cherry y cherry-pick
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
5. Cuando ocurre un conflicto, el
repositorio queda “bloqueado”
hasta que lo resolvemos
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
6. Estado del repositorio
• No podemos hacer push, pull, merge ni
rebase (entre otras cosas)
• Sí podemos ejecutar aquellos comandos
que nos permiten resolver el conflicto
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
7. Estado del repositorio
$ git status
# On branch menganito
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
#
#! both modified: cancion_del_pirata.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
$_
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
8. Estado del repositorio
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
9. Solución 0:
La patata caliente
• “Esto no es cosa mía, que lo haga otro”
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
10. Solución 0:
La patata caliente
git reset HEAD --hard
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
11. Demo
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
12. Resolviendo el
conflicto
• el fichero cancion_del_pirata.txt contiene
la información que necesitamos para
resolver el conflicto
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
13. Canción de manuel
<<<<<<< HEAD
Un soneto me manda hacer Violante,
en mi vida me he visto en tal aprieto;
catorce versos dicen que es soneto:
burla burlando van los tres delante. c Nuestros cambios
Yo pensé que no hallara consonante
y estoy a la mitad de otro cuarteto;
mas si me veo en el primer terceto
no hay cosa en los cuartetos que me espante.
=======
Con diez cervezas por barba,
grifo en mano, a toda vela,
no corta el bar, sino vuela
un borracho figurín. Los de nuestro
Manuel barrigas que llaman,
por su estómago, el Temido,
5
compañero de
en todo bar conocido
del uno al otro confín.
equipo
>>>>>>> fulanito
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
14. Resolviendo el
conflicto
¿Y cuál era el texto original?
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
15. Resolviendo el
conflicto
$ git reset --hard HEAD
$ git config merge.conflictstyle diff3
$ git merge <branch>
Auto-merging cancion_del_pirata.txt
CONFLICT (content): Merge conflict in cancion_del_pirata.txt
Automatic merge failed; fix conflicts and then commit the result.
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
16. Canción de manuel
<<<<<<< HEAD
Un soneto me manda hacer Violante,
en mi vida me he visto en tal aprieto;
catorce versos dicen que es soneto:
burla burlando van los tres delante.
Yo pensé que no hallara consonante
y estoy a la mitad de otro cuarteto;
mas si me veo en el primer terceto
no hay cosa en los cuartetos que me espante.
||||||| merged common ancestors
Con diez cañones por banda,
viento en popa, a toda vela,
no corta el mar, sino vuela
un velero bergantín.
Bajel pirata que llaman, 5
por su bravura, el Temido,
en todo mar conocido
del uno al otro confín.
=======
Con diez cervezas por barba,
grifo en mano, a toda vela,
no corta el bar, sino vuela
un borracho figurín.
Manuel barrigas que llaman, 5
por su estómago, el Temido,
en todo bar conocido
del uno al otro confín.
>>>>>>> fulanito
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
17. Demo
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
18. Resolviendo el
conflicto
• Podemos usar herramientas externas para
visualizar los conflictos
• Para eso usamos git mergetool
• En el caso que nos ocupa, instalaremos
meld
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
19. Resolviendo el
conflicto
• Instalación en OS-X
$ brew install meld
• Instalación en Linux
$ aptitude install meld
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
20. Resolviendo el
conflicto
$ git mergetool -t meld
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
21. Resolviendo el
conflicto
• Una vez editado el fichero, resolvemos el
conflicto ejecutando
$ git add cancion_del_pirata.txt
$ git commit
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
22. Resolviendo el
conflicto
Merge branch 'fulanito' into menganito
Conflicts:
cancion_del_pirata.txt
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch menganito
# All conflicts fixed but you are still merging.
# (use "git commit" to conclude merge)
#
# Changes to be committed:
#
# modified: cancion_del_pirata.txt
#
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
23. Otras formas de
resolver el conflicto
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
24. --theirs
git merge -s recursive -X theirs <branch>
• Esto hace que cualquier conflicto se resuelva
tomando las modificaciones de la rama a
incorporar
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
25. --theirs
• Estamos en medio de la resolución de un
conflicto que ha surgido al incorporar la
rama feature/3 en develop
• Para resolverlo, queremos quedarnos con la
versión de la rama feature/3
$ git checkout --theirs <fichero>
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
26. --ours
git merge -s recursive -X ours <branch>
• Esto hace que cualquier conflicto se resuelva
tomando las modificaciones de la rama a
incorporar
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
27. --ours
• Estamos en medio de la resolución de un
conflicto que ha surgido al incorporar la
rama feature/3 en develop
• Para resolverlo, queremos quedarnos con la
versión de la rama develop
$ git checkout --ours <fichero>
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13
28. Demo:
Conflictos en .xib
Resolviendo conflictos con git by aprendegit.com is licensed under a
cursodegit.com Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. aprendegit.com
jueves, 4 de abril de 13