2011-08-27 16 views
191

Esto a menudo me pasa a mí: escribo un código, reviso mis cambios y luego me doy cuenta de que no estoy en la rama correcta para verificar esos cambios. Sin embargo, no puedo cambiar a otra rama sin que mis cambios se reviertan. ¿Hay alguna manera de mover los cambios a otra rama para que se verifiquen allí?mover los archivos cambiados a otra sucursal para registrar

Respuesta

321

git stash es tu amigo.

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

Cambie a la rama en la que desea los cambios y ejecute git stash pop.

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

Un ejemplo:

# work on some code 
git stash 
git checkout correct-branch 
git stash pop 
+47

No es necesario que oculte cambios no confirmados, van con usted cuando verifica una sucursal. Stash es más para el almacenamiento a largo plazo de cosas temporales (cosas que quieres terminar y comprometer más tarde, pero tienes que hacer algo más en este momento). – Tekkub

+0

Entiendo esto. Así que tengo que esconder, cambiar de rama y luego pop 'C: \ kf [develop +0 ~ 4 -0]> función de pago de git/clientes
error: Sus cambios locales a los siguientes archivos se sobrescribirán con el pago:
AspWebApp.vNext/global.asa
RestApi/Web.config
Por favor, confirme sus cambios o guárdelos antes de poder cambiar de rama.
Aborto ' – IsmailS

+0

@Tekkub "almacenamiento a largo plazo de cosas temporales" que dice que se siente muy incómodo, otro punto para usar escondite es que lo empuja en una pila así que si no quieres que se transfiera y trabaje en otra cosa, es útil de esa manera. Sí, no tiene que hacerlo, solo se siente más limpio y tiene más control. – Atherion

113

Si aún no lo ha cometido sus cambios, sólo tiene que utilizar git checkout para pasar a la nueva rama y luego comprometerse con normalidad - cambios en los archivos no están atados a una rama particular hasta que los comprometerse.

Si usted tiene ya se ha comprometido sus cambios:

  1. Tipo git log y recordar el SHA de la confirmación que desea mover.
  2. Mira la rama a la que quieres mover la confirmación.
  3. Tipo git cherry-pick SHA sustituyendo el SHA de arriba.
  4. Vuelva a la rama original.
  5. Use git reset HEAD~1 para reiniciar antes de que se comprometa la rama incorrecta.

cherry-pick toma una confirmación determinada y la aplica al encabezado actualmente desprotegido, lo que le permite copiar la confirmación en una nueva sucursal.

+4

Brilliant! Me acabas de salvar de mí mismo. ;) – Ben

+4

+1 para 'cherry-pick' – Jackson

+3

Ni siquiera deberías tener que elegir aquí. 'git reset HEAD ~ N --soft' y luego' git checkout -b' para mover todo el _now_ código no asignado a una nueva rama. – Aaron

21

Si desea mover los cambios en una nueva rama, esto se puede hacer con sólo dos comandos:

git stash 
git stash branch new-branch 

De acuerdo con la git stash documentation:

branch <branchname> [<stash>]

Creates and checks out a new branch named <branchname> starting from the commit at which the <stash> was originally created, applies the changes recorded in to the new working tree and index.

0

Lamentablemente, esto le sucede a m e con bastante regularidad, así y yo uso git stash si me di cuenta de mi error antes git commit y uso git cherry-pick de lo contrario, se explican ambos comandos bastante bien en otras respuestas

Quiero añadir una aclaración para git checkout targetBranch: este comando sólo preservará su directorio de trabajo y puesta en escena de instantánea si targetBranch tiene la misma historia que su rama actual

If you haven't already committed your changes, just use git checkout to move to the new branch and then commit them normally

@ declaración de Amber no es falsa, cuando se mueve a una newBranch , git checkout -b newBranch, una nueva i puntero s creado y apunta a la misma confirmación exacta que su rama actual.
De hecho, si usted pasó a tener una otra rama que comparte la historia con su rama actual (ambos apuntan al mismo commit) puede "mover los cambios" por git checkout targetBranch

Sin embargo, por lo general diferentes ramas significa historia diferente, y Git no le permitirá cambiar entre estas ramas con un directorio de trabajo sucio o área de preparación. en cuyo caso se puede hacer ya sea git checkout -f targetBranch (cambios limpios y desechables) o git stage + git checkout targetBranch (limpia y ahorro cambios), simplemente ejecutando git checkout targetBranch dará un error:

error: Your local changes to the following files would be overwritten by checkout: ... Please commit your changes or stash them before you switch branches. Aborting

Cuestiones relacionadas