Dentro de mi rama maestra, hice un git merge some-other-branch
local, pero nunca empujé los cambios al maestro de origen. No quise fusionarme, así que me gustaría deshacerlo. Cuando git status
hice una después de mi fusión, recibí este mensaje:
# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.
Según algunas instrucciones que encontré , intenté ejecutar
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 sucursal esté por delante de ninguna cantidad de confirmaciones. ¿Cómo vuelvo a ese punto?
Respuestas:
Con
git reflog
comprobar qué confirmación es una antes de la fusión (git reflog
será una mejor opción quegit log
). Luego puede restablecerlo usando:También hay otra forma:
Te devolverá 1 commit.
Tenga en cuenta que los archivos modificados y no confirmados / sin reiniciar se restablecerán a su estado no modificado . Para mantenerlos alejados de los cambios o ver la
--merge
opción a continuación.Como @Velmont sugirió a continuación en su respuesta, en este caso directo usando:
podría producir mejores resultados, ya que debería preservar sus cambios.
ORIG_HEAD
señalará una confirmación directamente antes de que se produzca la fusión, por lo que no tiene que buscarla usted mismo.Un consejo adicional es usar el
--merge
interruptor en lugar de,--hard
ya que no restablece los archivos innecesariamente:fuente
git log
elige mostrar de forma predeterminada; tal vez haya una salida diferentegit log
ogit reflog
podría usarse para esto)git log
resultado, desea ver las dos confirmaciones principales. Una es la última confirmación en su rama, otra es la última confirmación en la rama en la que se fusionó. Desea quegit reset --hard
el padre se comprometa en la rama en la que se fusionó.git reset --hard <commit_sha>
Suponiendo que su maestro local no estuviera por delante del origen / maestro, debería poder hacer
Entonces su
master
sucursal local debería ser idéntica aorigin/master
.fuente
Ver capítulo 4 en el libro de Git y la publicación original de Linus Torvalds .
Para deshacer una fusión que ya fue empujada :
Asegúrese de revertir la reversión si está volviendo a comprometer la rama, como dijo Linus.
fuente
git revert -m 1 <commit>
. El problema es que hacer eso no borra la fusión accidental que hizo (y aún no ha presionado). Las otras respuestas que involucran reinicios duros son mejores para el problema del póster original.Es extraño que faltara el comando más simple. La mayoría de las respuestas funcionan, pero deshaciendo la fusión que acaba de hacer, esta es la manera fácil y segura :
El árbitro
ORIG_HEAD
apuntará al commit original antes de la fusión.(La
--merge
opción no tiene nada que ver con la fusión. Es igualgit reset --hard ORIG_HEAD
, pero más segura, ya que no toca los cambios no confirmados).fuente
git reset --merge ORIG_HEAD
conserva esos cambios.git reset --hard HEAD~5
solo restablecerá HEAD (puede eliminar confirmaciones tanto en maestro como en branch1). Solo la--merge
opción elimina elmerge
.--merge
opción en realidad no elimina la fusión, puede usarla--hard
también funcionará bien. Es la referencia ORIG_HEAD que es la pista aquí, se establece antes de hacer una fusión en el punto en el que se encuentra. :)git reset --hard ORIG_HEAD
comando funcionó perfectamente para mí: puede haber sido ayudado por el hecho de que no hice ningún otro cambio en el repositorio después del localgit merge
que estaba tratando de deshacer. El comando simplemente restablece el estado del repositorio a su estado anterior a la fusión. Gracias por el gran consejo!Con las versiones más nuevas de Git, si aún no ha comprometido la fusión y tiene un conflicto de fusión , simplemente puede hacer:
De
man git merge
:fuente
Debe restablecer la confirmación anterior. Esto debería funcionar:
O incluso
HEAD^^
revertir ese compromiso de reversión. Siempre puede dar una referencia SHA completa si no está seguro de cuántos pasos debe dar.En caso de que tenga problemas y su rama maestra no haya tenido cambios locales, puede restablecerla
origin/master
.fuente
ORIG_HEAD
para ti, ¿por qué no usarlo?Últimamente, he estado usando
git reflog
para ayudar con esto. Esto en su mayoría solo funciona si la fusión SÓLO ocurrió, y estaba en su máquina.git reflog
podría devolver algo como:La primera línea indica que se produjo una fusión. La segunda línea es el tiempo antes de mi fusión. Simplemente forzo
git reset --hard 43b6032
a esta rama a rastrear antes de la fusión, y continuar.fuente
reflog
para obtener el SHA y pasarlo agit reset
funcionar.Con Git moderno, puedes:
Sintaxis anterior:
Vieja escuela:
Pero en realidad, vale la pena notar que
git merge --abort
solo es equivalente a logit reset --merge
dado queMERGE_HEAD
está presente. Esto se puede leer en la ayuda de Git para el comando de fusión.Después de una fusión fallida, cuando no hay
MERGE_HEAD
, la fusión fallida se puede deshacergit reset --merge
, pero no necesariamente congit merge --abort
, por lo que no solo son sintaxis antiguas y nuevas 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 siempre uso.fuente
De acuerdo, las respuestas que otras personas me dieron fueron cercanas, pero no funcionó. Esto es lo que hice.
Haciendo esto...
... me dio el siguiente estado.
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.En este punto, vi que el mensaje de estado cambió, así que intenté hacer un
git pull
, y eso pareció funcionar:En resumen, mis órdenes se redujeron a esto:
fuente
HEAD^^^^
origin/master
;)Podrías usar
git reflog
para encontrar el pago anterior. A veces es un buen estado al que quieres volver.Concretamente
fuente
Si está en medio de la fusión, siempre puede abortarlo
git merge --abort
fuente
Pude resolver este problema con un solo comando que no implica buscar una identificación de confirmación.
La respuesta aceptada no funcionó para mí, pero este comando logró los resultados que estaba buscando.
fuente
Si aún no lo ha confirmado, solo puede usar
Deshacerá la fusión (y todo lo que hiciste).
fuente
Llegué a esta pregunta también buscando volver a coincidir con el origen (es decir, NO se compromete antes del origen). Investigando más, descubrí que hay un
reset
comando para exactamente eso:git reset --hard @{u}
Nota:
@{u}
es la abreviatura deorigin/master
. (Y, por supuesto, necesita ese repositorio remoto para que esto funcione).fuente
Tienes que cambiar tu CABEZA, no la tuya, por supuesto, sino git HEAD ...
Entonces, antes de responder, agreguemos algunos antecedentes, explicando qué es esto
HEAD
.First of all what is HEAD?
HEAD
es simplemente una referencia a la confirmación actual (más reciente) en la rama actual.Solo puede haber una sola
HEAD
en un momento dado. (excluyendogit worktree
)El contenido de
HEAD
se almacena dentro.git/HEAD
y contiene los 40 bytes SHA-1 de la confirmación actual.detached HEAD
Si no está en la última confirmación, lo que significa que
HEAD
apunta a una confirmación previa en la historia se llamadetached HEAD
.En la línea de comando, se verá así: SHA-1 en lugar del nombre de la rama ya
HEAD
que no apunta a la punta de la rama actualAlgunas opciones sobre cómo recuperarse de un HEAD separado:
git checkout
Esto verificará la nueva rama que apunta a la confirmación deseada.
Este comando pagará a un commit dado.
En este punto, puede crear una rama y comenzar a trabajar desde este punto en adelante.
git reflog
Siempre puedes usar el
reflog
también.git reflog
mostrará cualquier cambio que haya actualizadoHEAD
y revisando la entrada de reflog deseada establecerá elHEAD
respaldo de este commit.Cada vez que se modifique el HEAD habrá una nueva entrada en el
reflog
Esto lo llevará de regreso a su compromiso deseado
git reset --hard <commit_id>
"Mueva" su CABEZA de nuevo a la confirmación deseada.
también puedes usar el
git rebase --no-autostash
.git revert <sha-1>
"Deshacer" el compromiso o rango de compromiso dado.
El comando reset "deshacerá" cualquier cambio realizado en el commit dado.
Se confirmará una nueva confirmación con el parche de deshacer, mientras que la confirmación original también permanecerá en el historial.
Este esquema ilustra qué comando hace qué.
Como puede ver allí
reset && checkout
modifique elHEAD
.fuente
La respuesta más simple es la dada por odinho - Velmont
Primero hacer
git reset --merge ORIG_HEAD
Para aquellos que buscan restablecer después de presionar los cambios, haga esto (porque esta es la primera publicación vista para cualquier pregunta de combinación de restablecimiento de git)
git push origin HEAD --force
Esto se restablecerá de manera que no recupere los cambios combinados nuevamente después de extraer.
fuente
Solo para ver una opción adicional, he seguido principalmente el modelo de ramificación descrito aquí: http://nvie.com/posts/a-successful-git-branching-model/ y, como tal, me he estado fusionando con
--no-ff
(no avance rápido) generalmente.Acabo de leer esta página porque accidentalmente fusioné una rama de prueba en lugar de mi rama de lanzamiento con master para la implementación (sitio web, master es lo que está en vivo). La rama de prueba tiene otras dos ramas fusionadas y totaliza alrededor de seis confirmaciones.
Entonces, para revertir todo el commit, solo necesitaba uno
git reset --hard HEAD^
y revirtió toda la fusión. Dado que las fusiones no se reenviaron rápidamente, la fusión fue un bloqueo y un paso atrás es "rama no fusionada".fuente
Puede usar solo dos comandos para revertir una fusión o reiniciar mediante una confirmación específica:
git reset --hard commitHash
(debe usar la confirmación que desea reiniciar, por ejemplo, 44a587491e32eafa1638aca7738)git push origin HEAD --force
(Envío de la nueva rama maestra local a origen / maestro)Buena suerte y adelante!
fuente
Se puede hacer de múltiples maneras.
1) Abortar fusión
Si está en medio de una fusión incorrecta (por error, con una rama incorrecta), y desea evitar la fusión para volver a la última rama como se muestra a continuación:
2) Restablecer HEAD a rama remota
Si está trabajando desde la rama de desarrollo remoto, puede restablecer HEAD a la última confirmación en la rama remota de la siguiente manera:
3) Eliminar la rama actual y volver a pagar desde el repositorio remoto
Teniendo en cuenta que está trabajando en la sucursal de desarrollo en el repositorio local, que se sincroniza con la sucursal remota / de desarrollo, puede hacer lo siguiente:
fuente
Si su fusión y las confirmaciones correspondientes aún no se enviaron, siempre puede cambiar a otra rama, eliminar la original y volver a crearla.
Por ejemplo, fusioné accidentalmente una rama de desarrollo en maestro y quería deshacer eso. Usando los siguientes pasos:
Voila! El Maestro está en la misma etapa que el origen, y tu estado mal fusionado se borra.
fuente
Si desea una solución de línea de comandos, le sugiero que vaya con la respuesta de MBO.
Si eres un novato, puede que te guste el enfoque gráfico:
gitk
(desde la línea de comando, o haz clic derecho en el explorador de archivos si tienes eso)fuente
Estrategia: crear una nueva sucursal desde donde todo estaba bien.
Razón fundamental: Revertir una fusión es difícil. Hay demasiadas soluciones, dependiendo de muchos factores, como si se ha comprometido o empujado su fusión o si hubo nuevas confirmaciones desde su fusión. Además, aún debe tener una comprensión relativamente profunda de git para adaptar estas soluciones a su caso. Si sigue ciegamente algunas instrucciones, puede terminar con una "fusión vacía" donde nada se fusionará, y los intentos de fusión adicionales harán que Git le diga "Ya actualizado".
Solución:
Digamos que desea combinar
dev
enfeature-1
.Encuentre la revisión en la que desea recibir la fusión:
Compruébalo (retrocede en el tiempo):
Crea una nueva sucursal desde allí y échale un vistazo:
Ahora puede reiniciar su fusión:
Unir:
git merge dev
Arregla tus conflictos de fusión.
Cometer:
git commit
Cuando esté satisfecho con los resultados, elimine la rama anterior:
git branch --delete feature-1
fuente
Simplemente cree una nueva rama, luego seleccione las confirmaciones deseadas.
Es más simple y ahorrador, y luego se reinicia como se describe en muchas respuestas anteriores
fuente
Creo que puede hacer
git rebase -i [hash] [branch_name]
dónde[hash]
está el hash de identificación por el tiempo que desee rebobinar más uno (o por la cantidad de confirmaciones que desee ir) y luego elimine las líneas para las confirmaciones en el editor que ya no desea. . Guarda el archivo. Salida. Orar. Y debe ser rebobinado. Puede que tenga que hacer ungit reset --hard
, pero debería ser bueno en este punto. También puede usar esto para extraer confirmaciones específicas de una pila, si no desea mantenerlas en su historial, pero eso puede dejar su repositorio en un estado que probablemente no desee.fuente
Si cometió la fusión:
fuente
Primero, asegúrate de haber comprometido todo.
Luego restablezca su repositorio al estado de trabajo anterior:
o usando
--hard
( esto eliminará todos los cambios locales, no confirmados ):Use el hash que estaba allí antes de su commit incorrectamente fusionado.
Comprueba qué confirmaciones te gustaría volver a confirmar en la parte superior de la versión correcta anterior:
Aplique sus confirmaciones correctas en la parte superior de la versión correcta de su repositorio de la siguiente manera:
Mediante el uso de cherry-pick (los cambios introducidos por algunos commits existentes)
O seleccionando el rango de confirmaciones por:
Primero verifique los cambios correctos antes de fusionarlos:
Primero verifique los cambios correctos antes de fusionarlos:
donde este es el rango de las confirmaciones correctas que ha comprometido (excluyendo la combinación erróneamente comprometida).
fuente
git stash
git branch -d the_local_branch
git checkout -t <name of remote>
git stash apply
Esto funcionó para mí .. !!
fuente
Si nota que necesita revertir inmediatamente después de la fusión y no ha hecho nada más después del intento de fusión, puede emitir este comando:
git reset --hard HEAD@{1}
.Esencialmente, su fusión
sha
señalaráHEAD@{0}
si no se cometió nada más después de la fusión y también loHEAD@{1}
será el punto anterior antes de la fusión.fuente
La más simple de las posibilidades más simples, mucho más simple de lo que se dice aquí:
Elimine su sucursal local (local, no remota) y vuelva a tirar de ella. De esta forma, deshacerá los cambios en su rama maestra y cualquiera se verá afectado por el cambio que no desea impulsar. Comience de nuevo.
fuente
En este caso, querrá restablecer su rama con
git reset --hard <branch_name>
. Si desea guardar sus cambios antes de reiniciarlos, asegúrese de crear una nueva rama ygit checkout <branch_name>
.También puede restablecer el estado a una confirmación específica con
git reset --hard <commit_id>
.Si se han introducido los cambios, puede usarlos
git revert <branch_name>
. Asegúrese de consultar cómo usar git revert y git checkout en otros escenarios también.fuente