mover archivos modificados a otra rama para registrarse

422

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í?

social principal
fuente

Respuestas:

751

git stash es tu amigo.

Si aún no ha realizado la confirmación, simplemente ejecute git stash. Esto ahorrará todos sus cambios.

Cambie a la rama en la que desea realizar los cambios y ejecútelo git stash pop.

Hay muchos usos para git stash. Esta es sin duda una de las razones más útiles.

Un ejemplo:

# work on some code
git stash
git checkout correct-branch
git stash pop
Bill Door
fuente
122
No es necesario esconder los cambios no comprometidos, te acompañan cuando revisas una sucursal. Stash es más para el almacenamiento a largo plazo de cosas temporales (cosas que desea terminar y confirmar más tarde, pero debe hacer algo más ahora).
Tekkub
2
Entiendo esto. Así que tengo que esconderme, cambiar de rama y luego 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
explotar
3
@Tekkub "almacenamiento a largo plazo de cosas temporales", dicho dicho se siente muy incómodo, otro punto para usar alijo es que lo empuja en una pila, por lo que si no desea que continúe y trabaje en otra cosa, es útil de esa manera . Sí, no tiene que hacerlo, pero se siente más limpio y con más control.
Atherion
bravo bebé! debería agregar lo que debe hacer si realizó los compromisos
Ishan Srivastava
2
@Tekkub Eso solo es cierto si la sucursal a la que está cambiando está actualizada con la sucursal en la que se encuentra. Si, por ejemplo, está trabajando accidentalmente en una rama de producción y necesita cambiar a la rama de la etapa pero la etapa ha cambiado en el alijo de tiempo medio, es la única forma de hacer el cambio.
danielson317
248

Si aún no ha confirmado sus cambios , simplemente usegit 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:

  1. Tipo git log y recuerde el SHA del compromiso que desea mover.
  2. Echa un vistazo a la rama a la que quieres mover el commit.
  3. Escriba git cherry-pick SHAsustituyendo el SHA desde arriba.
  4. Vuelva a su rama original.
  5. Use git reset HEAD~1para 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.

Ámbar
fuente
99
Ni siquiera deberías tener que elegir aquí. git reset HEAD~N --softy luego git checkout -bmover todo el código ahora no confirmado a una nueva rama.
Aaron
19
los cambios en los archivos no están vinculados a una rama en particular hasta que los confirmes. <- esto. Esto resolvió un misterio para mí. Gracias.
Tschallacka
8
Recibo el siguiente error cuando intento cambiar de sucursal: "los cambios locales en los siguientes archivos se sobrescribirán al finalizar la compra". Entonces, no parece que pueda moverme a una rama diferente y comprometerme normalmente.
Mischa
3
@Mischa no funciona si está cambiando entre dos ramas que tienen historias diferentes
watashiSHUN
1
¡@Aaron es mucho mejor (para el escenario posterior a la confirmación)! Por favor haga una respuesta por separado.
Jacktose
16

Lamentablemente, esto también me sucede con bastante frecuencia y lo uso git stashsi me di cuenta de mi error antes git commity usogit cherry-pick otra manera, ambos comandos se explican bastante bien en otras respuestas

Quiero 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 actual

Si aún no ha confirmado sus cambios, solo use git checkout para pasar a la nueva sucursal y luego confirme normalmente

La declaración de @ Amber no es falsa, cuando se mueve a una nueva rama , git checkout -b newBranchse 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) o git stage+ git checkout targetBranch(limpiar y guardar cambios), simplemente ejecutar git checkout targetBranchdará un error:

error: sus cambios locales en los siguientes archivos se sobrescribirán al finalizar la compra: ... Confirme los cambios o guárdelos antes de cambiar de sucursal. Abortar

watashiSHUN
fuente
5

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.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

De git docs :

git reset [<mode>] [<commit>]Este formulario restablece el encabezado de la rama actual y posiblemente actualiza el índice (restableciéndolo al árbol de) y el árbol de trabajo dependiendo de. Si se omite, el valor predeterminado es --mixed. El debe ser uno de los siguientes:

--softNo toca el archivo de índice o el árbol de trabajo en absoluto (pero reinicia la cabeza, al igual que todos los modos). Esto deja todos los archivos modificados "Cambios a confirmar", como lo indicaría el estado de git.

JSON C11
fuente