merging - git unfinished merge
Me encontré con un conflicto de fusión. ¿Cómo puedo abortar la fusión? (10)
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 deberían abandonarse. ¿Cómo puedo hacer esto?
Como los comentarios sugieren que git reset --merge
es un alias para git merge --abort
, vale la pena notar que git merge --abort
solo es equivalente a git reset --merge
dado que MERGE_HEAD
está presente. Esto se puede leer en la ayuda de git para el comando de combinació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
, por lo que no solo son sintaxis antigua y nueva para la misma cosa .
Personalmente, encuentro que git reset --merge
mucho más potente para escenarios similares a los descritos, y fallos en general se fusionan.
Creo que es git reset
que necesitas.
Tenga en cuenta que git revert
significa algo muy diferente a, digamos, svn revert
- en Subversion, revert descartará sus cambios (no confirmados), devolviendo el archivo a la versión actual desde el repositorio, mientras que git revert
"deshace" un commit.
git reset
debería hacer el equivalente a svn revert
, es decir, descartar los cambios no deseados.
Dado que su pull
no tuvo éxito, HEAD
(no HEAD^
) es el último compromiso "válido" 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 "ellos":
git pull --strategy=theirs remote_branch
Pero esto ya ha sido eliminado, como lo explica Junio Hamano (el mantenedor de Git) en este mensaje . Como se señaló en el enlace , en su lugar, haría esto:
git fetch origin
git reset --hard origin
Desde Git 1.6.1.3 git checkout
ha podido realizar el checkout desde cualquier lado de una combinación:
git checkout --theirs _widget.html.erb
En este caso de uso particular, realmente no desea abortar la fusión, solo resuelva el conflicto de una manera particular.
No hay una 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 de aceptar los cambios del otro lado es solo para este archivo.
Para un archivo no fusionado en un conflicto, git pone a disposición las versiones comunes, locales y remotas del archivo en el índice. (Aquí es donde se leen para usarlos en una herramienta de diferencias de 3 vías de git mergetool
). Puede 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 de forma literal 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
Encontré que lo siguiente funcionó para mí (revertir un solo archivo para pre-fusionar el estado):
git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
Si su versión de git es> = 1.6.1, puede usar git reset --merge
.
Además, como @Michael Johnson menciona, 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.
De la página del manual de git merge.
git merge --abort
es equivalente a git reset --merge
cuando MERGE_HEAD
está presente.
MERGE_HEAD
está presente cuando hay una fusión en curso.
Además, con respecto a los cambios no confirmados al iniciar una fusión:
Si tiene cambios que no desea realizar antes de iniciar una fusión, simplemente git stash
antes de que la fusión y git stash pop
después de terminar la fusión o abortar.
Una alternativa, que preserva el estado de la copia de trabajo es:
git stash
git merge --abort
git stash pop
Por lo general, desaconsejo esto, porque en realidad es como fusionarse en Subversion, ya que elimina las relaciones de rama en el siguiente compromiso.
Y si terminas con un conflicto de combinación y no tienes nada que comprometer pero aún así se muestra el error de combinación después de aplicar todos los comandos mencionados a continuación,
git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin
por favor eliminar
.git / index.lock
Archivo [cortar pegar en otra ubicación en caso de recuperación] y luego ingrese cualquiera de los siguientes comandos dependiendo de la versión que desee.
git reset --hard HEAD
git reset --hard origin
¡¡¡Espero que ayude!!!
git merge --abort
Anule el proceso de resolución de conflictos actual e intente reconstruir el estado de fusión previa.
Si hubo cambios no confirmados en el área de trabajo cuando se inició la fusión,
git merge --abort
en algunos casos no podrá reconstruir estos cambios. Por lo tanto, se recomienda confirmar o guardar siempre los cambios antes de ejecutar git merge.
git merge --abort
es equivalente agit reset --merge
cuandoMERGE_HEAD
está presente.