Acabo de hacer un compromiso perfectamente bueno con la rama equivocada. ¿Cómo deshago la última confirmación en mi rama maestra y luego tomo los mismos cambios y los incluyo en mi rama de actualización?
git
git-commit
Mikewilliamson
fuente
fuente
git reset --soft HEAD\^
4 años de retraso en el tema, pero esto podría ser útil para alguien.
Si olvidó crear una nueva rama antes de comprometerse y se comprometió todo en master, no importa cuántas confirmaciones haya hecho, el siguiente enfoque es más fácil:
Ahora tiene su rama maestra igual
origin/master
y todas las nuevas confirmaciones están activadasmy_feature
. Tenga en cuenta quemy_feature
es una sucursal local, no remota.fuente
master
el problema, restablezcamaster
aorigin/master
.origin/master
ya está en la confirmación que desea restablecer. Sin embargo, el crédito por la propina es esta página: github.com/blog/…Si tiene una copia de trabajo limpia (sin modificar)
Para revertir una confirmación (asegúrese de anotar el hash de la confirmación para el siguiente paso):
Para llevar esa confirmación a una rama diferente:
Si tiene cambios modificados o sin seguimiento
También tenga en cuenta que
git reset --hard
va a matar a cualquier cambio sin seguimiento y modificados que pueda tener, por lo que si usted tiene los es posible que prefiera:fuente
git rev-parse BRANCH_NAME
para conseguir el shagit reflog show <branch>
!git stash
antes del reinicio y usargit stash pop
después para restaurarlos, por lo que no hay que tenerle miedo a la--hard
parteSi ya presionó sus cambios, deberá forzar su próximo empuje después de reiniciar el HEAD.
Advertencia: un restablecimiento completo deshacerá cualquier modificación no confirmada en su copia de trabajo, mientras que un empuje forzado sobrescribirá completamente el estado de la rama remota con el estado actual de la rama local.
Por si acaso, en Windows (usando la línea de comando de Windows, no Bash) en realidad es cuatro en
^^^^
lugar de uno, por lo que esfuente
git reset --hard COMMIT_HASH
git push --force
Recientemente hice lo mismo, donde accidentalmente cometí un cambio en master, cuando debería haberme comprometido con otra rama. Pero no presioné nada.
Si acaba de comprometerse con la rama equivocada, y no ha cambiado nada desde entonces, y no ha enviado al repositorio, puede hacer lo siguiente:
NOTA: en el ejemplo anterior, estaba rebobinando 1 commit con git reset HEAD ~ 1. Pero si desea rebobinar n commits, puede hacer git reset HEAD ~ n.
Además, si terminó comprometiéndose con la rama incorrecta, y también terminó escribiendo más código antes de darse cuenta de que se comprometió con la rama incorrecta, entonces podría usar git stash para guardar su trabajo en progreso:
NOTA: Usé este sitio web como referencia https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/
fuente
git checkout -b new_branch
derecho desde allí, las confirmaciones estaban intactas, solo presioné y creé un PR, no lo hice No tengo que comprometerme de nuevo.Entonces, si su escenario es con el que se comprometió
master
pero con el que se comprometióanother-branch
(que puede o no existir) pero aún no lo ha hecho, esto es bastante fácil de solucionar.Ahora todos tus compromisos
master
estarán activosanother-branch
.Fuente de amor de: http://haacked.com/archive/2015/06/29/git-migrate/
fuente
another-branch
Ya existía. En este caso, simplemente destruyó los compromisos que hice para dominar y no los ejecutéanother-branch
.Para elaborar esta respuesta, en caso de que tenga varias confirmaciones para pasar de, por ejemplo,
develop
anew_branch
:fuente
Si se encuentra con este problema y tiene Visual Studio, puede hacer lo siguiente:
Haga clic derecho en su rama y seleccione
View History
:Haga clic derecho en commit al que desea volver. Y revertir o restablecer según sea necesario.
fuente
Para confirmaciones múltiples en la rama incorrecta
Si para usted, se trata solo de 1 commit, entonces hay muchas otras soluciones de restablecimiento más fáciles disponibles. Para mí, tuve alrededor de 10 confirmaciones hechas accidentalmente en
master
lugar de, llamémoslobranch_xyz
, y no quería perder el historial de confirmaciones.Lo que podía hacer y lo que me salvó fue usar esta respuesta como referencia, usando un proceso de 4 pasos, que es:
master
branch_xyz
master
Aquí están los pasos anteriores en detalles:
Crear una nueva rama desde
master
(donde accidentalmente cometí muchos cambios)Nota: la
-b
bandera se usa para crear una nueva rama.Solo para verificar si lo hicimos bien, haría un rápido
git branch
para asegurarme de que estamos en latemp_branch_xyz
rama y unagit log
para verificar si tenemos los compromisos correctos.Combinar la rama temporal en la rama originalmente destinada para los commits, es decir
branch_xyz
.Primero, cambie a la rama original, es decir
branch_xyz
(es posible que deba hacerlogit fetch
si no lo ha hecho)Nota: Sin usar el
-b
indicadorAhora, fusionemos la rama temporal en la rama que tenemos actualmente retirada
branch_xyz
Puede que tenga que ocuparse de algunos conflictos aquí, si los hay. Puede presionar (lo haría) o pasar a los siguientes pasos, después de fusionar con éxito.
Deshaga las confirmaciones accidentales al
master
usar esta respuesta como referencia, primero cambie amaster
luego deshaga todo el camino para que coincida con el control remoto (o para confirmar en particular, si lo desea)
Nuevamente, haría un
git log
antes y un después solo para asegurarme de que los cambios previstos surtieran efecto.Borrar la evidencia, eso es borrar la rama temporal. Para esto, primero debe verificar la rama en la que se fusionó la temperatura, es decir
branch_xyz
(si permanece encendidomaster
y ejecuta el siguiente comando, puede obtener unerror: The branch 'temp_branch_xyz' is not fully merged
), así que vamos ay luego elimine la prueba de este contratiempo
Ahí tienes.
fuente
Si la rama a la que desea aplicar sus cambios ya existe ( desarrollo de la rama , por ejemplo), siga las instrucciones proporcionadas por fotanus a continuación, luego:
Y, obviamente, podría usar tempbranch o cualquier otro nombre de rama en lugar de my_feature si lo desea.
Además, si corresponde, retrase el stash pop (aplicar) hasta que se haya fusionado en su rama de destino.
fuente
Para mí, esto se resolvió revirtiendo el compromiso que había presionado, y luego seleccionando ese compromiso para la otra rama.
Puede usar
git log
para encontrar el hash correcto, ¡y puede impulsar estos cambios cuando lo desee!fuente