Dentro de mi rama maestra, hice un git merge some-other-branch
local, pero nunca empujé los cambios al maestro de origen. No era mi intención fusionarme, así que me gustaría deshacerlo. Al hacer un git status
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 rama esté por delante en ningún número de confirmaciones. ¿Cómo vuelvo a ese punto?
Con git reflog
comprobar cuál de las confirmaciones es una antes de la fusión ( git reflog
será una mejor opción que git log
). Entonces puedes restablecerlo usando:
git reset --hard commit_sha
También hay otra forma:
git reset --hard HEAD~1
Te devolverá 1 compromiso.
Tenga en cuenta que todos los archivos modificados y no confirmados / sin atascar se restablecerán a su estado sin modificar . Para mantenerlos, guarde los cambios o vea la --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 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 usar el --merge
interruptor en lugar de, --hard
ya que no restablece los 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 los 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 estaba por delante del origen / maestro, debería poder hacer
git reset --hard origin/master
Entonces su master
sucursal local debería verse idéntica a origin/master
.
Consulte el capítulo 4 del libro de Git y la publicación original de Linus Torvalds .
Para deshacer una combinación que ya se presionó :
git revert -m 1 commit_hash
Asegúrese de revertir la reversión si está comprometiendo la rama nuevamente, como dijo Linus.
Es extraño que faltara el comando más simple. La mayoría de las respuestas funcionan, pero deshaciendo la combinación que acaba de hacer, esta es la forma fácil y segura :
git reset --merge ORIG_HEAD
La referencia ORIG_HEAD
apuntará a la confirmación original de antes de la fusión.
(La --merge
opción no tiene nada que ver con la combinación. Es igual git reset --hard ORIG_HEAD
, pero más segura, ya que no toca los cambios no confirmados).
Con las versiones más recientes de Git, si aún no ha realizado la fusión y tiene 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 dado lugar a conflictos.
git merge --abort
abortará el proceso de fusión e intentará reconstruir el estado anterior a la fusión.
Debería restablecer a la confirmación anterior. Esto debería funcionar:
git reset --hard HEAD^
O incluso HEAD^^
para revertir ese compromiso de reversión. Siempre puede dar una referencia SHA completa si no está seguro de cuántos pasos hacia atrás debe dar.
En caso de que tenga problemas y su rama maestra no tenga ningún cambio local, puede restablecer a origin/master
.
Últimamente, lo he estado usando git reflog
para ayudar con esto. En su mayoría, esto solo funciona si la fusión SOLO 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 segunda línea es el tiempo antes de mi fusión. Simplemente git reset --hard 43b6032
para obligar a esta rama a realizar un seguimiento desde antes de la fusión y continuar.
Con Git moderno, puede:
git merge --abort
Sintaxis anterior:
git reset --merge
Vieja escuela:
git reset --hard
Pero en realidad, vale la pena notar que git merge --abort
solo equivale 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 lo mismo .
Personalmente encuentro git reset --merge
mucho más poderoso y útil en el trabajo diario, así que ese es el que siempre uso.
De acuerdo, las respuestas que me dieron otras personas aquí fueron cercanas, 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 hacía eso, el mensaje cambiaba 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 que el mensaje de estado cambió, así que intenté hacer un git pull
, y 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
Puede utilizar git reflog
para buscar el pago anterior. A veces es un buen estado al que desea volver.
Concretamente,
$ git reflog $ git reset --hard [email protected]{0}
Si estás en medio de una fusión, siempre puedes abortarla. git merge --abort
Tienes que cambiar tu HEAD, no la tuya por supuesto, pero 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 uno HEAD
en un momento dado. (excluyendo git worktree
)
El contenido de HEAD
se almacena en el interior .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 anterior en el historial, se llama detached 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 actual
git checkout
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
Esto comprobará una nueva rama que apunta a la confirmación deseada.
Este comando se ejecutará en una confirmación determinada.
En este punto, puede crear una rama y comenzar a trabajar a partir de este punto.
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# create a new branch forked to the given commit
git checkout -b <branch name>
git reflog
Siempre puedes usar el reflog
también.
git reflog
mostrará cualquier cambio que haya actualizado el HEAD
y comprobar la entrada de reflog deseada volverá a establecer HEAD
este compromiso.
Cada vez que se modifique HEAD habrá una nueva entrada en el reflog
git reflog
git checkout [email protected]{...}
Esto te llevará de vuelta a tu compromiso deseado.
git reset --hard <commit_id>
"Mueve" tu HEAD de nuevo a la confirmación deseada.
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
git rebase --no-autostash
.git revert <sha-1>
"Deshacer" el compromiso dado o el rango de compromiso.
El comando de reinicio "deshará" cualquier cambio realizado en la confirmación dada.
Se confirmará una nueva confirmación con el parche para deshacer, mientras que la confirmación original también permanecerá en el historial.
# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>
Este esquema ilustra qué comando hace qué.
Como puede ver, reset && checkout
modifique el archivo HEAD
.
Pude resolver este problema con un solo comando que no implica buscar una identificación de confirmación.
git reset --hard remotes/origin/HEAD
La respuesta aceptada no funcionó para mí, pero este comando logró los resultados que estaba buscando.
Si aún no lo cometió, solo puede usar
$ git checkout -f
Deshacerá la fusión (y todo lo que hiciste).
Llegué a esta pregunta también buscando revertir para que coincida con el origen (es decir, NO se confirma antes del origen). Investigando más, descubrió que hay un reset
comando para exactamente eso:
git reset --hard @{u}
Nota: @{u}
es la abreviatura de origin/master
. (Y, por supuesto, necesita ese repositorio remoto para que esto funcione).
Se puede hacer de varias formas.
1) Abortar fusión
Si se encuentra entre una combinación incorrecta (realizada por error con una rama incorrecta) y desea evitar la combinación para volver a la última rama como se muestra a continuación:
git merge --abort
2) Restablecer HEAD a la rama remota
Si está trabajando desde una rama de desarrollo remota, puede restablecer HEAD a la última confirmación en la rama remota como se muestra a continuación:
git reset --hard origin/develop
3) Elimine la rama actual y vuelva a realizar el pago desde el repositorio remoto
Teniendo en cuenta que está trabajando en la rama de desarrollo en el repositorio local, que se sincroniza con la rama remota / de desarrollo, puede hacer lo siguiente:
git checkout master
##to delete one branch, you need to be on another branch, otherwise you will fall with the branch :)
git branch -D develop
git checkout -b develop origin/develop
La respuesta más sencilla es la de odinho - Velmont
Primero haz git reset --merge ORIG_HEAD
Para aquellos que buscan restablecer después de que se presionan los cambios, haga esto (porque esta es la primera publicación vista para cualquier pregunta de fusión de git reset)
git push origin HEAD --force
Esto se restablecerá de una manera que no volverá a obtener los cambios combinados después de la extracción.
Solo para ver una opción adicional, he estado siguiendo principalmente el modelo de ramificación que se describe aquí: http://nvie.com/posts/a-successful-git-branching-model/y como tal se han fusionado con --no-ff
(sin avance rápido) generalmente.
Acabo de leer esta página porque accidentalmente había fusionado una rama de prueba en lugar de mi rama de lanzamiento con el maestro para la implementación (sitio web, el maestro 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 compromiso, solo necesitaba uno git reset --hard HEAD^
y revertió 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".
Puede usar solo dos comandos para revertir una combinació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 al origen / maestro)¡Buena suerte y adelante!
Si su combinación y las confirmaciones correspondientes aún no se han enviado, siempre puede cambiar a otra rama, eliminar la original y volver a crearla.
Por ejemplo, fusioné accidentalmente una rama de desarrollo en master y quise deshacer eso. Usando los siguientes pasos:
git checkout develop
git branch -D master
git branch -t master origin/master
¡Voila! El maestro está en la misma etapa que el origen y su estado de fusión errónea se borra.
Si desea una solución de línea de comandos, le sugiero que elija la respuesta de MBO.
Si eres un novato, es posible que te guste el enfoque gráfico:
gitk
(desde la línea de comando, o haga clic con el botón derecho en el explorador de archivos si lo tiene)Estrategia: Crea una nueva rama desde donde todo estuvo bien.
Justificación: Revertir una fusión es difícil. Hay demasiadas soluciones, dependiendo de muchos factores, como si se ha comprometido o impulsado su fusión o si hubo nuevas confirmaciones desde su fusión. Además, todavía necesita tener un conocimiento relativamente profundo de git para adaptar estas soluciones a su caso. Si sigue ciegamente algunas instrucciones, puede terminar con una "combinación vacía" en la que no se combinará nada, y más intentos de combinación harán que Git le diga "Ya está actualizado".
Solución:
Digamos que quieres fusionarte dev
en feature-1
.
Busque la revisión que desea recibir la combinación:
git log --oneline feature-1
a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
Compruébalo (retrocede en el tiempo):
git checkout e5f6g7h8
Crea una nueva rama desde allí y compruébalo:
git checkout -b feature-1
Ahora puede reiniciar su fusión:
Unir: git merge dev
Arregle sus conflictos de fusión.
Cometer: git commit
Cuando esté satisfecho con los resultados, elimine la rama anterior: git branch --delete feature-1
Simplemente cree una nueva rama, luego seleccione las confirmaciones deseadas.
Su ahorro y más simple luego se reinicia descrito en muchas respuestas anteriores
Si las ramas se mueven y no se empujan. Luego, el comando git reset funcionará para deshacer la fusión: git reset --merge ORIG_HEAD
Creo que puede hacer git rebase -i [hash] [branch_name]
dónde [hash]
está el hash de identificación para el tiempo que desee rebobinar más uno (o cuántas confirmaciones desea volver) y luego eliminar las líneas de las confirmaciones en el editor que ya no desea . Guarda el archivo. Salida. Rezar. Y debería rebobinarse. Puede que tengas que hacer una git reset --hard
, pero debería ser buena 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.
Si cometió la fusión:
git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard
Primero, asegúrese de haber cometido todo.
Luego, restablezca su repositorio al estado de trabajo anterior:
$ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
o usando --hard
(¡ esto eliminará todos los cambios locales, no confirmados! ):
$ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
Use el hash que estaba allí antes de su confirmación fusionada erróneamente.
Compruebe qué confirmaciones le gustaría volver a confirmar en la parte superior de la versión correcta anterior de la siguiente manera:
$ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
...
commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
...
Aplique sus confirmaciones correctas en la parte superior de la versión correcta de su repositorio de la siguiente manera:
Utilizando cherry-pick (los cambios introducidos por algunas confirmaciones existentes)
git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
O seleccionando el rango de confirmaciones mediante:
Primero verificando los cambios correctos antes de fusionarlos:
git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
Primero verificando los cambios correctos antes de fusionarlos:
git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
donde este es el rango de las confirmaciones correctas que ha cometido (excluyendo la fusión cometida incorrectamente).
git stash
git branch -d the_local_branch
git checkout -t <name of remote>
git stash apply
¡¡Esto funcionó para mí .. !!
Si usted nota que necesita volver inmediatamente después de la fusión y no ha hecho otra cosa después del intento de combinación, sólo puede emitir este comando: git reset --hard [email protected]{1}
.
Básicamente, su combinación sha
apuntará a [email protected]{0}
si no se confirmó nada más después de la combinación y, por [email protected]{1}
lo tanto , será el punto anterior antes de la combinación.
La más simple de las más simples posibilidades, mucho más simple que cualquier cosa que se diga aquí:
Retire su sucursal local (local, no remota) y tire de ella nuevamente. De esta manera, deshará los cambios en su rama maestra y cualquiera se verá afectado por el cambio que no desea impulsar. Empiece de nuevo.
La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.
Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.
Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.
Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.
Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.
Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?
Tapas elásticas de silicona de Tomorrow's Kitchen, paquete de 12 | $14 | Amazonas | Código promocional 20OFFKINJALids son básicamente los calcetines de la cocina; siempre perdiéndose, dejando contenedores huérfanos que nunca podrán volver a cerrarse. Pero, ¿y si sus tapas pudieran estirarse y adaptarse a todos los recipientes, ollas, sartenes e incluso frutas en rodajas grandes que sobran? Nunca más tendrás que preocuparte por perder esa tapa tan específica.
Hemos pirateado algunas ciudades industriales en esta columna, como Los Ángeles y Las Vegas. Ahora es el momento de una ciudad militar-industrial-compleja.
Un minorista está enlatando su sección de tallas grandes. Pero no están tomando la categoría solo en línea o descontinuándola por completo.
Entiendo totalmente, completamente si tienes una relación difícil con los animales de peluche. Son lindos, tienen valor sentimental y es difícil separarse de ellos.
El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.
Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon
El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.
El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".
Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.
Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.
“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.
Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.