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.
Guia Basica para bachillerato de Circuitos Basicos
Resolución de conflictos en git
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