2011-01-07 13 views
14

Por lo general, me sucede que realizo algunos cambios locales, solo para descubrir que lo hice en la rama incorrecta, así que necesito cambiar de bifurcación antes de confirmar. El problema es que no puedo cambiar de rama cuando hay cambios locales. ¿Hay alguna forma de hacer eso?GIT: Agregar cambios locales a la sucursal no actual

Obviamente, puedo copiar los archivos actualizados, cambiar de rama, y ​​luego copiarlos de nuevo, pero esto realmente no parece inteligente!

Respuesta

16

Puede cambiar de ramas mientras tiene modificaciones locales a menos que los cambios locales entren en conflicto con la diferencia entre las dos ramas. En este caso, puede usar la opción -m o --merge en checkout para realizar el pago de todas formas y realizar una fusión entre cambios y cambios causados ​​por el cambio de sucursales.

git checkout -m other-branch 
9

Uso git stash cuando esto sucede. Crea una confirmación temporal del estado actual de la copia de trabajo (archivos en caché y no en caché) y revierte la copia de trabajo al HEAD actual. Luego puede cambiar a la otra rama y hacer git stash pop.

+0

Sweet. Solo tienes que asegurarte de que tus cambios estén organizados. Funciona perfectamente. – helios

+0

muy resbaladizo, definitivamente algo esconde hace que sea muy fácil de hacer – Martin

2

Como dice otro, puede usar stash o checkout --merge. Sin embargo, esa opción causará un cambio en la marca de tiempo de algún archivo. Si está trabajando en un proyecto grande donde la compilación puede llevar mucho tiempo (nuestro proyecto actual tarda media hora en compilarse con compilaciones distribuidas), esto puede no ser óptimo.

En esta situación, puede usar otro repositorio para mover la confirmación a la rama correcta. En primer lugar, tendrá que clonar el repositorio actual (esta necesidad de hacer sólo una vez):

$ git clone /path/to/repository repository.clone 
$ cd repository.clone 
$ git remote add origin repository.clone 
$ git fetch origin 

Luego, en su repositorio actual, envíe sus cambios:

$ cd /path/to/repository 
$ git add path/to/modified/files 
$ git commit -m 'Commit message' 

Por otro repositorio , de hacer salir el nuevo commit, y moverlo a la rama correcta:

$ cd ../repository.clone 
$ git fetch origin 
$ git checkout correct-branch 
$ git reset --hard origin/correct-branch 
$ git cherry-pick origin/current-branch 
$ # resolve conflicts if any, commit with -c option in this case 
$ git push origin correct-branch:correct-branch 

a continuación, en el repositorio original, se quita cometer el temporal, y quita la modificación asociada (excepto si se quiere k eep ellos en ambas ramas).

$ cd /path/to/repository 
$ git reset HEAD^ 
$ # edit file and remove modifications moved to other branch 

Esto es más compleja e implican la reescritura de la historia, pero cuando su proyecto es muy grande, y el tiempo de compilación es un factor limitante, puede ser grande saber la técnica. Tenga en cuenta que puede reutilizar el repositorio clonado, por lo que no hay necesidad de eliminarlo/recrearlo cada vez (si el tiempo de compilación es largo, entonces el repositorio es probablemente grande, y la clonación puede llevar algo de tiempo).

Cuestiones relacionadas