Pregunta Me encontré con un conflicto de fusión. ¿Cómo puedo abortar la fusión?


solía git pull y tuvo 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, así que todos mis cambios deberían abandonarse. ¿Cómo puedo hacer esto?


1911
2017-09-19 13:21


origen


Respuestas:


Desde su pull no tuvo éxito entonces HEAD (no HEAD^) es la última confirmación "válida" en su rama:

git reset --hard HEAD

La otra pieza que desea es dejar que sus cambios anulen sus cambios.

Las versiones anteriores de git le permitieron usar la estrategia de fusión "suya":

git pull --strategy=theirs remote_branch

Pero esto ya se eliminó, como se explica en este mensaje de Junio ​​Hamano (el mantenedor de Git). Como se menciona en el enlace, en cambio, harías esto:

git fetch origin
git reset --hard origin

1727
2017-09-19 14:33



Si su versión de git es> = 1.6.1, puede usar git reset --merge.

Además, como menciona @Michael Johnson, si su versión de git es> = 1.7.4, también puede usar git merge --abort.

Como siempre, asegúrese de no tener cambios no confirmados antes de comenzar una fusión.

Desde el página de man de git merge

git merge --abort es equivalente a git reset --merge cuando MERGE_HEAD está presente.

MERGE_HEAD está presente cuando una fusión está en progreso.

Además, con respecto a los cambios no confirmados al iniciar una fusión:

Si tiene cambios que no quiere confirmar antes de comenzar una fusión, solo git stash ellos antes de la fusión y git stash pop después de terminar la combinación o abortarla.


1584
2018-03-28 23:16



git merge --abort

Abortar el proceso actual de resolución de conflictos e intentar reconstruir   el estado previo a la fusión.

Si hubo cambios de árbol de trabajo no comprometidos presentes cuando la fusión   empezado, git merge --abort en algunos casos no podrá   reconstruir estos cambios Por lo tanto, se recomienda siempre   cometer o esconder sus cambios antes de ejecutar git merge.

git merge --abort es equivalente a git reset --merge cuando    MERGE_HEAD está presente.

http://www.git-scm.com/docs/git-merge


378
2017-11-12 21:40



En este caso de uso particular, realmente no desea abortar la fusión, simplemente resuelva el conflicto de una manera particular.

No hay ninguna necesidad particular de reiniciar y realizar una fusión con una estrategia diferente, tampoco. Los conflictos han sido resaltados correctamente por git y el requisito para aceptar los cambios de los otros lados es solo para este archivo.

Para un archivo no compartido en un conflicto, git pone a disposición la base común, las versiones local y remota del archivo en el índice. (Aquí es donde se leen para su uso en una herramienta de 3 vías diff por git mergetool.) Puedes usar git show para verlos.

# 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 bien, con git> = 1.6.1:

git checkout --theirs _widget.html.erb

73
2017-09-20 10:41



creo que es git reset necesitas.

Cuidado con eso git revert significa algo muy diferente a, por ejemplo, svn revert - en Subversion, la reversión descartará los cambios (no confirmados) y devolverá el archivo a la versión actual desde el repositorio, mientras que git revert "deshace" un commit.

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


72
2017-09-19 13:25



Dado que los comentarios sugieren que git reset --merge es un alias para git merge --abort, vale la pena notar que git merge --abort es solo equivalente a git reset --mergedado que un MERGE_HEAD está presente. Esto se puede leer en la ayuda de git para el comando de fusión.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Después de una fusión fallida, cuando no hay MERGE_HEAD, la fusión fallida se puede deshacer con git reset --merge pero no necesariamente con git merge --abort, así que no son solo una sintaxis vieja y nueva para la misma cosa.

Personalmente encuentro git reset --merge mucho más poderoso para escenarios similares a los descritos, y fracasos fallidos en general.


29
2018-04-02 12:16



Desde Git 1.6.1.3 git checkout ha podido realizar el pago desde cualquier lado de una fusión:

git checkout --theirs _widget.html.erb

16
2017-07-17 01:29



Una alternativa que preserva el estado de la copia de trabajo es:

git stash
git merge --abort
git stash pop

Generalmente desaconsejo esto, porque es efectivamente como fusionarse en Subversion ya que descarta las relaciones de bifurcación en la siguiente confirmación.


13
2017-07-13 18:57