Deshacer una combinación de Git que aún no se ha enviado
Accidentalmente ejecuté git merge some_other_branch
mi rama maestra local. No he enviado los cambios al maestro de origen. ¿Cómo deshago la fusión?
Después de fusionarse, git status
dice:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
¿Cómo deshago todas estas confirmaciones?
Verifique git reflog
qué confirmación es anterior a la fusión ( git reflog
será una mejor opción que git log
). Luego puedes restablecerlo usando:
git reset --hard commit_sha
También hay otra manera:
git reset --hard HEAD~1
Te devolverá 1 compromiso.
Tenga en cuenta que cualquier archivo modificado y no confirmado/no almacenado se restablecerá a su estado no modificado . Para mantenerlos guardados, guarde los cambios o consulte --merge
la 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 producir mejores resultados, ya que debería preservar sus cambios. ORIG_HEAD
apuntará a una confirmación directamente antes de que se produzca la fusión, por lo que no tendrá que buscarla usted mismo.
Un consejo adicional es utilizar el --merge
interruptor en lugar de --hard
ya que no restablece archivos innecesariamente:
git reset --merge ORIG_HEAD
--unir
Restablece el índice y actualiza los archivos en el árbol de trabajo que son diferentes entre <commit> y HEAD, pero mantiene aquellos que son diferentes entre el índice y el árbol de trabajo (es decir, que tienen cambios que no se han agregado).
Suponiendo que su maestro local no estuviera por delante de origen/maestro, debería poder hacerlo
git reset --hard origin/<branch-name>
Entonces, suponiendo que hayas hecho esto en master
, entonces tu master
sucursal local debería verse idéntica a origin/master
.
Consulte el capítulo 4 del libro Git y la publicación original de Linus Torvalds .
Para deshacer una combinación que ya fue enviada :
git revert -m 1 commit_hash
Asegúrese de revertir la reversión si vuelve a confirmar la rama, como dijo Linus.