2009-08-20 23 views
229

Estaba trabajando en una rama de git y estaba listo para enviar mis cambios, por lo que realicé una confirmación con un mensaje de confirmación útil. Entonces, sin pensarlo, realicé pequeños cambios en el código que no vale la pena guardar. Ahora quiero cambiar las ramas, pero me da git,git: cambiar de rama e ignorar cualquier cambio sin confirmar

error: You have local changes to "X"; cannot switch branches.

Pensé que podía cambiar las ramas sin comprometerme. Si es así, ¿cómo puedo configurar esto? Si no, ¿cómo salgo de este problema? Quiero ignorar los pequeños cambios sin comprometerme y simplemente cambiar las ramas.

+1

Creo que esto sólo ocurre cuando los cambios se realizaron para cometer pero no comprometidos? El proceso de pago de git funciona perfectamente para cambiar las sucursales si todavía no has organizado los archivos usando git add o similares. –

+1

Hola Jeremy, ¿Qué quieres decir con 'escenificado'? Obligar al usuario a confirmar el archivo antes de cambios de ramas no parece un gran flujo de trabajo. Por ejemplo, si estoy en el repositorio principal y rápidamente quiero verificar algo en una rama. Primero tengo que asignar el código al maestro, ¡incluso si el código está medio escrito! ¿Está diciendo que, de hecho, debería ser posible verificar una sucursal en esta situación? –

+0

@boyfarrell Puede usar 'Git stash' para guardar temporalmente los cambios sin comprometerse. – Howiecamp

Respuesta

297

Necesita un estado limpio para cambiar las ramas. El registro de la sucursal solo se permitirá si no afecta los "archivos sucios" (como Charles Bailey comentarios en los comentarios).

De lo contrario, deberán:

  • stash su cambio actual o
  • reset --hard HEAD (si no te importa perder esos cambios menores) o
  • checkout -f (Al cambiar ramas, continúe incluso si el el índice o el árbol de trabajo difiere de HEAD. Esto se utiliza para descartar los cambios locales.)
+28

"Necesita un estado limpio para cambiar las ramas". solo es verdadero si el cambio de rama afecta a los 'archivos sucios'. –

+0

Gran respuesta de VonC y comentario de Charles Bailey –

+6

Para el método de ocultación, escribí "guardar git stash", "git checkout otherbranch", y finalmente "git stash pop". –

7

Si ha realizado cambios en los archivos que Git también necesita cambiar al cambiar de rama, no le permitirá hacerlo. Para descartar los cambios de trabajo, use:

git reset --hard HEAD 

Luego, podrá cambiar de rama.

12

Seguir,

$: git checkout -f 

$: git checkout next_branch 
90

Si desea descartar los cambios,

git checkout -- <file> 
git checkout branch 

Si desea conservar los cambios,

git stash save 
git checkout branch 
git stash pop 
+8

De hecho, lo que dice Romerun (para ser completo): 'git stash save' (cuando está en la rama de trabajoY) luego' git checkout branchX' hace algo 'git add/commit -m' etc.' git checkout branchY' y 'git stash pop 'para recuperar el alijo – Highmastdon

+2

Tal vez sea así. Sin embargo, tengo una situación en la que quiero hacer lo que dice la respuesta, si lo estoy entendiendo bien: cambios ocultos, cambiar de Y a X, y luego cambiar y confirmarlos en X. –

51

así, debe ser

git stash save 
git checkout branch 
// do something 
git checkout oldbranch 
git stash pop 
+3

Sí, el alijo es global, no la rama específico, si escondo pop después de cambiar de rama obtendré el mismo escondite que en la (s) otra (s) rama (s) –

+4

Debería tenerse en cuenta que 'git stash' quedará por defecto en 'git stash save' –

+0

Gracias, es muy útil para mí –

7

Nota que si ha fusionado sucursales remotas o tiene confirmaciones locales d querer volver a la cabeza remota que debe hacer:

git reset --hard origin/HEAD 

HEAD solo se referirá únicamente a nivel local para confirmar/merge - varias veces he olvidado que al restablecer y terminar con "su repositorio es X se compromete por adelantado ... "cuando intenté nukear TODOS los cambios/confirmaciones y regresar a la rama remota.

0

de conmutación a una nueva rama cambios perder:

git checkout -b YOUR_NEW_BRANCH_NAME --force 

de conmutación a una rama existente perder los cambios:

git checkout YOUR_BRANCH --force 
Cuestiones relacionadas