stash repositorio rama que partir otra crear git branch

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.

  1. git stash

Crea y cambia a una nueva rama y luego abre el alijo en solo un paso.

  1. 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í?

  1. git commit los cambios de inmediato con un buen mensaje de confirmación.
  2. git reset HEAD~1 para deshacer la confirmación de la rama actual.
  3. (opcional) continuar trabajando en la función.

A veces, más tarde (de forma asíncrona), o inmediatamente en otra ventana de terminal:

  1. cd my-project-master que es otro WD que comparte el mismo .git
  2. git reflog para encontrar la git reflog de git reflog que acabo de hacer.
  3. 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:

  1. cd my-project que es el WD principal en el que estoy trabajando.
  2. 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