Pregunta Deshacer una fusión de Git que aún no se ha empujado


Dentro de mi rama principal, hice un git merge some-other-branch localmente, pero nunca empujó los cambios al maestro de origen. No quise fusionarme, así que me gustaría deshacerlo. Al hacer una git status después de mi fusión, estaba recibiendo este mensaje:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

Basado en algunos instrucciones que encontré, Intenté correr

git revert HEAD -m 1

pero ahora recibo este mensaje con git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

No quiero que mi rama esté adelantada por cualquier cantidad de compromisos. ¿Cómo vuelvo a ese punto?


3075
2018-03-05 19:24


origen


Respuestas:


Con git reflog compruebe qué compromiso es uno antes de la fusión (la opción de git reflog será mejor que el registro de git). Luego puedes restablecerlo usando:

git reset --hard commit_sha

También hay otra manera

git reset --hard HEAD~1

te devolverá 1 commit.

Tenga en cuenta que los archivos modificados y no confirmados se restablecerán a su estado no modificado. Para mantenerlos escondidos, cambiarlos o ver --merge opción a continuación.


Como @Velmont sugirió a continuación en su respuesta, en este caso directo usando:

git reset --hard ORIG_HEAD

podría arrojar mejores resultados, ya que debe preservar sus cambios. ORIG_HEAD señalará un compromiso directamente antes de que se haya producido la fusión, por lo que no tendrá que buscarlo usted mismo.


Otro consejo es usar el --merge cambiar en lugar de --hard ya que no restablece los archivos innecesariamente:

--unir

Restablece el índice y actualiza los archivos en el árbol de trabajo que son diferentes entre <commit> y HEAD, pero mantiene los que son diferentes entre el índice y el árbol de trabajo (es decir, que tienen cambios que no se han agregado).


3368
2018-03-05 19:34



Asumiendo que su maestro local no estaba por delante del origen / maestro, debería poder hacer

git reset --hard origin/master

Entonces tu local master la rama debe ser idéntica a origin/master.


1289
2018-03-17 18:06



Ver capítulo 4 en el libro de Git y la publicación original de Linus Torvalds.

Para deshacer una fusión eso ya estaba empujado:

git revert -m 1 commit_hash

Asegúrate de revertir la reversión si estás comprometiendo la rama nuevamente, como dijo Linus.


1083
2018-06-02 16:31



Es extraño que el comando más simple haya desaparecido. La mayoría de las respuestas funcionan, pero deshaciendo la combinación que acabas de hacer, esta es la manera fácil y segura:

git reset --merge ORIG_HEAD

La referencia ORIG_HEAD apuntará a la confirmación original antes de la fusión.

(Los --merge la opción no tiene nada que ver con la fusión. Es como git reset --hard ORIG_HEAD, pero es más seguro ya que no toca los cambios no confirmados).


831
2018-01-29 15:46



Con las versiones más nuevas de Git, si aún no has cometido la fusión y tienes un conflicto de fusión, simplemente puede hacer:

git merge --abort

De man git merge:

[Esto] solo se puede ejecutar después de que la combinación haya generado conflictos. git merge --abort abortará el proceso de fusión e intentará reconstruir el estado previo a la fusión.


306
2018-02-12 02:13



Debe restablecer a la confirmación anterior. Esto debería funcionar:

git reset --hard HEAD^

O incluso HEAD^^ para revertir ese compromiso de revertir. Siempre puede proporcionar una referencia SHA completa si no está seguro de cuántos pasos debe realizar.

En caso de que tengas problemas y tu rama principal no tenga cambios locales, puedes restablecer a origin/master.


104
2018-03-05 19:31



Últimamente, he estado usando git reflog para ayudar con esto Esto en su mayoría solo funciona si la fusión SÓLO sucedió, y estaba en su máquina.

git reflog podría devolver algo como:

fbb0c0f [email protected]{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 [email protected]{1}: checkout: moving from master to my-branch
e3753a7 [email protected]{2}: rebase finished: returning to refs/heads/master
e3753a7 [email protected]{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 [email protected]{4}: reset: moving to HEAD^
8400a0f [email protected]{5}: rebase: aborting

La primera línea indica que se produjo una fusión. La 2da línea es el tiempo antes de mi fusión. Yo simplemente git reset --hard 43b6032 para forzar a esta rama a rastrear desde antes de la fusión, y continuar.


78
2017-12-19 17:51



Con Git moderno, puedes:

git merge --abort

Sintaxis antigua:

git reset --merge

Vieja escuela:

git reset --hard

Pero en realidad, vale la pena notar que git merge --abort es solo equivalente a git reset --merge Dado que 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 y útil en el trabajo diario, así que ese es el que uso siempre.


42
2018-05-08 19:13



Bien, las respuestas que otras personas aquí me dieron estaban cerca, pero no funcionó. Esto es lo que hice.

Haciendo esto...

git reset --hard HEAD^
git status

... me dio el siguiente estado.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

Luego tuve que escribir el mismo git reset comando varias veces más. Cada vez que hice eso, el mensaje cambió en uno como puede ver a continuación.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

En este punto, vi el mensaje de estado cambiado, así que traté de hacer una git pully eso pareció funcionar:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

En resumen, mis órdenes se redujeron a esto:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

32
2018-03-05 19:54