repositorio - ¿Cómo combinar mis cambios locales no comprometidos en otra rama de Git?
git stash (6)
El alijo, las confirmaciones temporales y la reorganización pueden ser excesivos. Si aún no ha agregado los archivos modificados al índice, es posible que solo pueda retirar la otra rama.
git checkout branch2
Esto funcionará siempre que ningún archivo que esté editando sea diferente entre branch1 y branch2. Te dejará en branch2 con los cambios de trabajo conservados. Si son diferentes, puede especificar que desea combinar sus cambios locales con los cambios introducidos al cambiar de sucursal con la opción -m
para pagar.
git checkout -m branch2
Si ha agregado cambios al índice, primero querrá deshacer estos cambios con un restablecimiento. (Esto conservará su copia de trabajo, solo eliminará los cambios en etapas).
git reset
¿Cómo puedo hacer esto en git:
Mi sucursal actual es branch1 y he realizado algunos cambios locales. Sin embargo, ahora me doy cuenta de que realmente quería aplicar estos cambios a branch2. ¿Hay alguna manera de aplicar / fusionar estos cambios para que se conviertan en cambios locales en branch2 sin confirmarlos en branch1?
Las respuestas proporcionadas hasta ahora no son ideales porque requieren mucho trabajo innecesario para resolver conflictos de combinación, o hacen demasiadas suposiciones que con frecuencia son falsas. Así es como hacerlo perfectamente. El enlace es a mi propio sitio.
Cómo comprometerse con una rama diferente en git
Tiene cambios no confirmados en my_branch
que desea comprometer a master
, sin realizar todos los cambios desde my_branch
.
Ejemplo
git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop
Explicación
Comience por fusionar el master
con su rama, ya que tendrá que hacerlo eventualmente de todos modos, y ahora es el mejor momento para resolver cualquier conflicto.
La opción -u
(también --include-untracked
como --include-untracked
) en git stash -u
evita que pierdas archivos sin seguimiento cuando más tarde haces git clean -f -d
en master
.
Después de git checkout master
es importante que NO git stash pop
, porque necesitarás este alijo más tarde. Si my_branch
el alijo creado en my_branch
y luego lo hace con git stash
en el master
, causará conflictos de combinación innecesarios cuando luego aplique ese alijo en my_branch
.
git reset
desempapa todo lo que resulte del git stash apply
. Por ejemplo, los archivos que se han modificado en el stash pero que no existen en el master
se almacenan como conflictos "eliminados por nosotros".
git checkout .
y git clean -f -d
descarta todo lo que no se haya confirmado: todos los cambios en los archivos rastreados, y todos los archivos y directorios sin seguimiento. Ya están guardados en el alijo y si se dejan en el master
causarán conflictos de fusión innecesarios al volver a cambiar a my_branch
.
El último git stash pop
se basará en el my_branch
original, por lo que no causará ningún conflicto de combinación. Sin embargo, si su alijo contiene archivos sin seguimiento que se ha comprometido a dominar, git se quejará de que "No se pudieron restaurar los archivos sin seguimiento del alijo". Para resolver este conflicto, elimine esos archivos de su árbol de trabajo, luego git stash pop
, git add .
, y git reset
.
Si se tratara de cambios comprometidos, debería echar un vistazo a git-rebase, pero como lo señala VonC en sus comentarios, al hablar de cambios locales, git-stash sería la mejor manera de hacerlo.
Una alternativa más corta al enfoque de alijo mencionado anteriormente sería:
Mueve temporalmente los cambios a un alijo.
-
git stash
Crea y cambia a una nueva rama y luego abre el alijo en solo un paso.
-
git stash branch new_branch_name
Luego solo add
y commit
los cambios a esta nueva rama.
ADVERTENCIA: No para git novatos.
Esto surge lo suficiente en mi flujo de trabajo que casi he intentado escribir un nuevo comando git para ello. El flujo habitual de git stash
es el camino a seguir, pero es un poco incómodo. Por lo general, primero hago un nuevo compromiso, ya que si he estado observando los cambios, toda la información está fresca en mi mente y es mejor comenzar a git commit
lo que encontré (por lo general, una corrección de errores perteneciente al maestro que descubro mientras trabajo en una rama característica) de inmediato.
También es útil, si se encuentra en situaciones como esta, tener otro directorio de trabajo junto con el actual que siempre tenga la rama
master
comprobada.
Entonces, ¿cómo logro esto va así?
-
git commit
los cambios de inmediato con un buen mensaje de confirmación. -
git reset HEAD~1
para deshacer la confirmación de la rama actual. - (opcional) continuar trabajando en la función.
A veces, más tarde (de forma asíncrona), o inmediatamente en otra ventana de terminal:
-
cd my-project-master
que es otro WD que comparte el mismo.git
-
git reflog
para encontrar lagit reflog
degit reflog
que acabo de hacer. -
git cherry-pick SHA1
del commit.
Opcionalmente (aún asíncrono), puede reajustar (o fusionar) su rama de características para obtener la corrección de errores, generalmente cuando está a punto de enviar un RP y ya ha limpiado su rama de características y WD:
-
cd my-project
que es el WD principal en el que estoy trabajando. -
git rebase master
para obtener las correcciones de errores.
De esta manera, puedo seguir trabajando en la función sin interrupciones y no tengo que preocuparme por el git stash
nada de Git o por tener que limpiar mi WD antes de realizar una git checkout
(y luego volver a verificar la rama de la función) y seguir teniendo todas mis correcciones de errores. va al master
lugar de oculto en mi rama de función.
IMO git stash
y git checkout
es un PIA real cuando estás trabajando en una gran característica.
Dado que sus archivos aún no están comprometidos en branch1
:
git stash
git checkout branch2
git stash pop
o
git stash
git checkout branch2
git stash list # to check the various stash made in different branch
git stash apply x # to select the right one
Según lo comentado por benjohn (ver página de manual de git stash
):
Para esconder también los archivos actualmente sin seguimiento (recién agregados), agregue el argumento
-u
, por lo que:
git stash -u