¿Cómo soluciono una rama git incorrecta?

Acabo de hacer una gran solución en la rama equivocada. ¿Cómo puedo cancelar la última confirmación en mi rama principal, y luego hacer los mismos cambios y obtenerlos en mi rama de actualización?

414
31 мая '10 в 8:30 2010-05-31 08:30 establecido por mikewilliamson el 31 de mayo de 2010 a las 8:30 AM de 2010-05-31 08:30
@ 8 respuestas

Si aún no ha hecho clic en sus cambios, también puede hacer un restablecimiento automático:

 git reset --soft HEAD^ 

Esto devolverá un compromiso, pero devolverá los cambios corregidos a su índice. Suponiendo que las sucursales son relativamente modernas entre sí, git le permitirá ejecutar un cheque en otra rama, después de lo cual simplemente puede corregir:

 git checkout branch git commit 

La desventaja es que necesita volver a ingresar el mensaje de confirmación.

618
31 мая '10 в 8:53 2010-05-31 08:53 Respondió a Blair Holloway el 31 de mayo de 2010 a las 8:53 2010-05-31 08:53

Si tiene una copia de trabajo limpia (sin modificar)

Deshaga una confirmación (asegúrese de verificar el hash de confirmación para el siguiente paso):

 git reset --hard HEAD^ 

Para transferir esta fijación a otra rama:

border=0
 git checkout other-branch git cherry-pick COMMIT-HASH 

Si has cambiado o no has rastreado los cambios.

También tenga en cuenta que git reset --hard matará cualquier cambio no jugable y modificado que pueda tener, por lo que si tiene los que prefiere:

 git reset HEAD^ git checkout . 
79
31 мая '10 в 8:33 2010-05-31 08:33 Respondió a Michael Mrozek el 31 de mayo de 2010 a las 8:33 2010-05-31 08:33

4 años tarde en el tema, pero puede ser útil para alguien.

Si olvidó crear una nueva rama antes de comprometer y transferir todo al dominio, no importa cuánto haya hecho, el siguiente enfoque es más sencillo:

 git stash # skip if all changes are committed git branch my_feature git reset --hard origin/master git checkout my_feature git stash pop # skip if all changes were committed 

Ahora su rama principal es origin/master , y todas las confirmaciones nuevas están en my_feature . Tenga en cuenta que my_feature es una rama local, no remota.

61
06 февр. La respuesta se da fotanus 06 feb. 2014-02-06 17:44 '14 a las 17:44 2014-02-06 17:44

Si ya ha realizado los cambios, deberá forzar el siguiente después de reiniciar la CABEZA.

 git reset --hard HEAD^ git merge COMMIT_SHA1 git push --force 

Advertencia: el restablecimiento completo cancelará cualquier cambio pendiente en su copia de trabajo, mientras que al presionar se 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 hay cuatro ^^^^ lugar de uno, por lo tanto

 git reset --hard HEAD^^^^ 
17
31 мая '10 в 9:11 2010-05-31 09:11 Igor Zevaka da la respuesta el 31 de mayo de 2010 a las 9:11 2010-05-31 09:11

Hace poco hice lo mismo cuando accidentalmente hice la transición al maestro, cuando tuve que dedicarme a otra rama. Pero no empujé nada.

Si acaba de hacer la rama incorrecta y no ha cambiado nada desde entonces y no ha hecho clic en el repositorio, puede hacer lo siguiente:

 // rewind master to point to the commit just before your most recent commit. // this takes all changes in your most recent commit, and turns them into unstaged changes. git reset HEAD~1 // temporarily save your unstaged changes as a commit that not attached to any branch using git stash // all temporary commits created with git stash are put into a stack of temporary commits. git stash // create other-branch (if the other branch doesn't already exist) git branch other-branch // checkout the other branch you should have committed to. git checkout other-branch // take the temporary commit you created, and apply all of those changes to the new branch. //This also deletes the temporary commit from the stack of temp commits. git stash pop // add the changes you want with git add... // re-commit your changes onto other-branch git commit -m "some message..." 

NOTA. En el ejemplo anterior, rebobiné la fijación 1 con git reset HEAD ~ 1. Pero si desea rebobinar n confirmaciones, puede hacer un git reset HEAD ~ n.

Además, si ha terminado de trabajar con la rama incorrecta, y también ha terminado de escribir otro código, antes de darse cuenta de que ha hecho la rama incorrecta, puede usar git stash para guardar su trabajo sin terminar:

 // save the not-ready-to-commit work you're in the middle of git stash // rewind n commits git reset HEAD~n // stash the committed changes as a single temp commit onto the stack. git stash // create other-branch (if it doesn't already exist) git branch other-branch // checkout the other branch you should have committed to. git checkout other-branch // apply all the committed changes to the new branch git stash pop // add the changes you want with git add... // re-commit your changes onto the new branch as a single commit. git commit -m "some message..." // pop the changes you were in the middle of and continue coding git stash pop 

NOTA. Utilicé este sitio como enlace https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/

4
31 мая '17 в 0:51 2017-05-31 00:51 Ali Mizan da la respuesta el 31 de mayo de 17 a las 0:51 2017-05-31 00:51

Por lo tanto, si su secuencia de comandos es que pasó master , pero estaba destinado a pasar a another-branch (que puede o no puede existir), pero aún no ha hecho clic, es bastante fácil de corregir.

 // if your branch doesn't exist, then add the -b argument git checkout -b another-branch git branch --force master origin/master 

Ahora todos tus compromisos para master estarán en another-branch .

Fuentes: http://haacked.com/archive/2015/06/29/git-migrate/

2
08 апр. Responder Lorcan O'Neill 08 abr. 2016-04-08 16:19 '16 a las 4:19 PM 2016-04-08 16:19

Si encuentra este problema y tiene Visual Studio, puede hacer lo siguiente:

Haga clic derecho en su rama y seleccione View History :

2019

05 апр. La respuesta se da Trevor 05 apr. 2017-04-05 02:39 '17 a las 2:39 2017-04-05 02:39

Si la rama a la que desea aplicar sus cambios ya existe (por ejemplo, para desarrollar sucursales), siga las instrucciones proporcionadas por fotanus a continuación, luego:

 git checkout develop git rebase develop my_feature # applies changes to correct branch git checkout develop # 'cuz rebasing will leave you on my_feature git merge develop my_feature # will be a fast-forward git branch -d my_feature 

Y, obviamente, puede usar tempbranch o cualquier otro nombre de rama en lugar de my_feature si lo desea.

Además, si corresponde, demore el mensaje emergente (aplicar) hasta que esté unido en su rama de destino.

0
24 авг. la respuesta es dada por fbicknel 24 ago. 2016-08-24 01:15 '16 a la 1:15 am 2016-08-24 01:15

Otras preguntas sobre las etiquetas o Haz una pregunta