Esto a menudo me sucede: escribo un código, voy a revisar mis cambios y luego me doy cuenta de que no estoy en la rama adecuada para registrar esos cambios. Sin embargo, no puedo cambiar a otra rama sin revertir mis cambios. ¿Hay alguna forma de mover los cambios a otra rama para que se verifique allí?
422
C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
Si aún no ha confirmado sus cambios , simplemente use
git checkout
para moverse a la nueva rama y luego confirme normalmente; los cambios en los archivos no están vinculados a una rama particular hasta que los confirme.Si ya ha confirmado sus cambios:
git log
y recuerde el SHA del compromiso que desea mover.git cherry-pick SHA
sustituyendo el SHA desde arriba.git reset HEAD~1
para restablecer antes de su confirmación de rama incorrecta.cherry-pick
toma un compromiso determinado y lo aplica al encabezado actualmente desprotegido, lo que le permite copiar el compromiso a una nueva rama.fuente
git reset HEAD~N --soft
y luegogit checkout -b
mover todo el código ahora no confirmado a una nueva rama.Lamentablemente, esto también me sucede con bastante frecuencia y lo uso
git stash
si me di cuenta de mi error antesgit commit
y usogit cherry-pick
otra manera, ambos comandos se explican bastante bien en otras respuestasQuiero agregar una aclaración para
git checkout targetBranch
: este comando solo preservará su directorio de trabajo y la instantánea por etapas si targetBranch tiene el mismo historial que su rama actualLa declaración de @ Amber no es falsa, cuando se mueve a una nueva rama ,
git checkout -b newBranch
se crea un nuevo puntero y apunta exactamente a la misma confirmación que su rama actual.De hecho, si tiene otra rama que comparte el historial con su rama actual (ambas apuntan a la misma confirmación) puede "mover sus cambios"
git checkout targetBranch
Sin embargo, por lo general, las diferentes ramas significan un historial diferente, y Git no le permitirá cambiar entre estas ramas con un directorio de trabajo sucio o un área de preparación. en cuyo caso puede hacer
git checkout -f targetBranch
(limpiar y descartar cambios) ogit stage
+git checkout targetBranch
(limpiar y guardar cambios), simplemente ejecutargit checkout targetBranch
dará un error:fuente
Un restablecimiento de git suave devolverá los cambios confirmados a su índice. Luego, verifique la rama en la que tenía la intención de comprometerse. Luego git commit con un nuevo mensaje de confirmación.
git reset --soft <commit>
git checkout <branch>
git commit -m "Commit message goes here"
De git docs :
fuente