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
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
¿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
¿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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
--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
--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
--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
--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
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

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 unconflicto, 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