Cómo deshacer una fusión git con conflictos

785

Estoy en la rama mybranch1. mybranch2se bifurca mybranch1y se realizaron cambios en mybranch2.

Luego, mientras estaba encendido mybranch1, lo hice git merge --no-commit mybranch2 Muestra que hubo conflictos al fusionar.

Ahora quiero descartar todo (el mergecomando) para que mybranch1vuelva a ser lo que era antes. No tengo idea de cómo hago esto.

Anshul
fuente

Respuestas:

1355

Último Git:

git merge --abort

Esto intenta restablecer su copia de trabajo al estado en que se encontraba antes de la fusión. Eso significa que debería restaurar los cambios no confirmados antes de la fusión, aunque no siempre puede hacerlo de manera confiable. En general, no debe fusionarse con cambios no confirmados de todos modos.

Antes de la versión 1.7.4:

git reset --merge

Esta es una sintaxis anterior pero hace lo mismo que la anterior.

Antes de la versión 1.6.2:

git reset --hard

que elimina todos los cambios no confirmados, incluida la fusión no confirmada. A veces, este comportamiento es útil incluso en versiones más nuevas de Git que admiten los comandos anteriores.

Daniel Cassidy
fuente
1
Pero para versiones anteriores de git, esta es la forma de usar
Anshul
77
A veces todavía necesita usar git reset --mergeincluso en versiones más recientes. He tenido un git merge --aborterror (sin hacer cambios) donde git reset --mergetiene éxito (y hace lo correcto) en git 2.2.1.
Theodore Murdock
Descubrí que tenía que hacer, git merge --abortseguido de git reset --mergecuando el conflicto de automerge aparecía en mi escondite.
Chef Faraón
1
generalmente git merge --abortfunciona para mí, sin embargo, me encontré en una situación en la que salí en un estado HEAD separado, y uno de mis archivos tenía un estado "ambos modificados". Quería descartar todo y volver a una sucursal, tuve que hacerlo git reset --hard, git merge --abortme dijeron que no había fusión para abortar (falta MERGE_HEAD).
yano
A veces git merge --abortno es capaz de devolverle su estado anterior, y en ese caso la "sintaxis anterior"git reset --hard funciona.
Kevin Stewart
130

En realidad, vale la pena notar que git merge --abortsolo es equivalente a lo git reset --mergedado que MERGE_HEADestá presente. Esto se puede leer en el comando git help for merge.

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

Después de una fusión fallida, cuando no existe MERGE_HEAD, la fusión fallida se puede deshacer git reset --mergepero no necesariamente con git merge --abort, por lo que no solo son sintaxis antiguas y nuevas para la misma cosa .

Personalmente me parece git reset --mergemucho más útil en el trabajo diario.

Martin G
fuente
2
Gracias, esta información fue muy útil. Tuve una fusión que comenzó con git stash applyuna rama incorrecta y git merge --abortno hice nada (no MERGE_HEAD), mientras que git reset --mergehice el truco.
geomaster
44
He visto a unas 10 personas que dicen que git merge --abortes el nuevo comando git reset --mergey me encontré con el mismo problema que @geomaster. ¡Fue súper útil, gracias!
Tom
106

Asumiendo que estás usando el último git,

git merge --abort
Adam Dymitruk
fuente
Ok, esto no funciona con 1.7.0.7 :(. Tengo que usar reset --duro con él
Anshul
5

Hay dos cosas que puede hacer primero deshacer la fusión por comando

git merge --abort

o

puede ir a su estado de confirmación anterior temporalmente por comando

git checkout 0d1d7fc32 
Manish Kumar Singh
fuente
0

Sourcetree

Si no confirma su fusión, simplemente haga doble clic en otra rama (= pago) y cuando sourcetree le pregunte si desea descartar todos los cambios, acepte

Kamil Kiełczewski
fuente