2010-05-31 10 views
495

A veces sucede que realizo algunos cambios en mi directorio de trabajo y me doy cuenta de que estos cambios deben confirmarse en una rama diferente a la actual. Esto generalmente sucede cuando quiero probar cosas nuevas o hacer algunas pruebas y me olvido de crear una nueva rama de antemano, pero no quiero enviar código sucio a la rama principal.Cómo comprometer mis cambios actuales a una rama diferente en git

Entonces, ¿cómo puedo hacer que los cambios no confirmados (o los cambios almacenados en el índice) se comprometan con una rama diferente a la actual?

Respuesta

727

Las otras respuestas que sugieren que revisar la otra rama y luego comprometerse con ella solo funcionan si la verificación es posible debido a las modificaciones locales. Si no es así, estás en el caso de uso más común para git stash:

git stash 
git checkout other-branch 
git stash pop 

La primera stash esconde sus cambios (básicamente haciendo cometer un temporal), y la posterior stash pop les vuelve a aplicar. Esto le permite a Git usar sus capacidades de fusión.

Si cuando intenta abrir el alijo, se encuentra con conflictos de combinación ... los próximos pasos dependen de cuáles sean esos conflictos. Si todos los cambios ocultos pertenecen a esa otra rama, simplemente tendrá que ordenarlos a través de ellos, es una consecuencia de haber realizado los cambios en la rama incorrecta.

Por otro lado, si realmente ha cometido un error, y su árbol de trabajo tiene una combinación de cambios para las dos ramas, y los conflictos están justo en los que desea confirmar en la rama original, usted puede ahorrar algo de trabajo Como de costumbre, hay muchas maneras de hacer esto. Aquí hay uno, a partir de después de que el pop y ver los conflictos:

# Unstage everything (warning: this leaves files with conflicts in your tree) 
git reset 
# Add the things you *do* want to commit here 
git add -p  # or maybe git add -i 
git commit 
# The stash still exists; pop only throws it away if it applied cleanly 
git checkout original-branch 
git stash pop 
# Add the changes meant for this branch 
git add -p 
git commit 
# And throw away the rest 
git reset --hard 

Alternativamente, si se da cuenta antes de la hora de que esto va a suceder, simplemente cometer las cosas que pertenecen a la rama actual. Siempre se puede volver y modificar que se comprometan:

git add -p 
git commit 
git stash 
git checkout other-branch 
git stash pop 

Y, por supuesto, recordar que todo esto tomó un poco de trabajo, y evitar que la próxima vez, tal vez poniendo el nombre de la rama actual en su pronta añadiendo $(__git_ps1) a tu PS1 en tu bashrc. (Consulte, por ejemplo, los documentos Git in Bash)

+0

Cuando dijiste: 'Revisar la sucursal y luego comprometerse solo funcionaría si el pago fuera posible dadas las modificaciones locales'. ¿Qué quieres decir? ¿Te importaría dar/debatir un ejemplo simple cuando eso fallaría? –

+5

@ user815423426 Si tiene cambios no confirmados, puede verificar otra rama si y solo si el conjunto de archivos que ha cambiado y el conjunto de archivos que difieren entre las dos ramas son disjuntos. Es decir, si ha modificado el archivo A, puede consultar otra rama solo si el archivo A es el mismo en ambas ramas. – Cascabel

+0

¡Gracias! Cuando dijiste que 'A' es el mismo en ambas ramas, te refieres a 'A' antes de mis cambios (es decir, 'A' en la CABEZA de cada rama). ¿Correcto? –

18
  1. git checkout my_other_branch
  2. git add my_file my_other_file
  3. git commit -m

y proporcionar su mensaje de confirmación.

+1

es posible que desee escribir lo que * co * y * ci * es ... aunque uno puede adivinarlo (finalizar, confirmar) ^^ – tanascius

+2

@tanascius Buena sugerencia, hecho. He estado usando los alias tanto tiempo que olvidé que no son los predeterminados. –

45

Puede simplemente crear una nueva bifurcación y activarla. Confirmar los cambios a continuación:

git branch dirty 
git checkout dirty 
// And your commit follows ... 

Como alternativa, también puede pagar el pedido una rama existente (solo git checkout <name>). Pero solo, si no hay colisiones (la base de todos los archivos editados es la misma que en su rama actual). De lo contrario, recibirás un mensaje.

+9

Tenga en cuenta que en el caso de cambiar a ** existente ** *** rama divergente *** puede usar la opción '-m' para indicar a git que intente combinar los cambios, es decir,' git checkout -m ' –

+2

@ Jefromi's la respuesta es mejor en casi todos los casos, creo. –

+3

Versión más corta: 'git checkout -b dirty' – user1338062

Cuestiones relacionadas