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 --aborten 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 --abortes equivalente agit reset --mergecuandoMERGE_HEADestá presente.