Me he encontrado con un conflicto de fusión. ¿Cómo puedo abortar la fusión?

Usé git pull y tuve un conflicto de fusión:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

Sé que la otra versión del archivo es buena y que la mía es mala por lo que todos mis cambios deben ser abandonados. ¿Cómo puedo hacer esto?

Como tu pull no tuvo éxito, entonces HEAD (no HEAD^) es el último commit "válido" en tu rama:

git reset --hard HEAD

La otra parte que quieres es dejar que sus cambios anulen los tuyos.

Las versiones más antiguas de git te permitían utilizar la estrategia de fusión "de ellos":

git pull --strategy=theirs remote_branch

Pero esto ha sido eliminado, como se explica en este mensaje de Junio Hamano (el mantenedor de Git). Como se indica en el enlace, en su lugar se haría esto:

git fetch origin
git reset --hard origin
Comentarios (11)

Creo que lo que necesitas es git reset.

Ten en cuenta que git revert significa algo muy diferente a, por ejemplo, svn revert - en Subversion el revert descartará tus cambios (no comprometidos), devolviendo el archivo a la versión actual del repositorio, mientras que git revert "deshace" un commit.

El comando git reset debería hacer el equivalente a svn revert, es decir, descartar los cambios no deseados.

Comentarios (0)

En este caso concreto, no se quiere abortar la fusión, sino resolver el conflicto de una manera determinada.

Tampoco es necesario reiniciar y realizar una fusión con una estrategia diferente. Los conflictos han sido señalados correctamente por git y el requisito de aceptar los cambios de la otra parte es sólo para este archivo.

Para un archivo no fusionado en un conflicto, git pone a disposición la base común, las versiones locales y remotas del archivo en el índice. (Aquí es donde se leen para su uso en una herramienta de diferencias a tres bandas por git mergetool). Puedes usar git show para verlas.

# common base:
git show :1:_widget.html.erb

# 'ours'
git show :2:_widget.html.erb

# 'theirs'
git show :3:_widget.html.erb

La forma más sencilla de resolver el conflicto para usar la versión remota textualmente es:

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

O, con git >= 1.6.1:

git checkout --theirs _widget.html.erb
Comentarios (3)