Git: trabajar en una rama incorrecta: cómo copiar los cambios en la rama de tema existente

333

He estado trabajando en un proyecto, pero desafortunadamente, olvidé cambiar a mi sucursal y, como tal, he estado trabajando en master

¿Cómo puedo copiar el trabajo (3 archivos) que he hecho aquí desde master a mi sucursal (llamada, por ejemplo, branch123 ) sin iniciar el master?

Alex
fuente

Respuestas:

540

Parece que todo lo que necesitas es lo siguiente:

git stash
git checkout branch123
git stash apply

Entonces deberías estar de vuelta en tu propia rama sin tocar la rama maestra.

gnab
fuente
66
ok, lo ejecuté, pero cuando vuelvo al master (git checkout master) y ejecuto el estado de git, los mismos archivos todavía están "modificados". ¿Es eso lo que se espera?
Alex
55
Es posible que no tenga que esconderse, si las diferencias entre su rama actual (maestra) y la rama temática (rama123) no están en ninguno de los archivos que ha modificado localmente. Git te permitirá simplemente ver la rama del tema en ese caso.
Cascabel
3
@ Alex: Sí, eso se espera. Esto no implica compromisos. stashguarda las modificaciones locales y luego stash applylas recupera.
Cascabel
66
¿Cómo puedo "deshacerme" de ellos de la rama maestra ... para dejar eso limpio?
Alex
77
git reset --hard HEADy estás de vuelta a la última confirmación que hiciste a tu rama maestra.
Gnab
46

La respuesta aceptada es la más completa, pero hay un caso especial en el que puede simplificar. Si los archivos que ha modificado en el directorio de trabajo son idénticos en ambos mastery branch123simplemente puede hacer

git checkout branch123

No es necesario guardar nada, ya que el comportamiento predeterminado de checkoutNO es sobrescribir los archivos modificados en su directorio de trabajo, por lo que no perderá nada. (Esto fue mencionado en los comentarios primero por Cascabel)

Como otras personas han mencionado en los comentarios, si branch123aún no existe, puede hacer

git checkout -b branch123

Basado en lo que encontré aquí .

Russel Dirks
fuente
3
O, si desea crear una nueva sucursal,git checkout -b newbranch
Phil Mitchell
2
Esto funciona mejor para mí que el alijo y es mucho más fácil. ¡Gracias!
Matthias
31
No, esto no funciona. Git te mostrará este mensaje: "confirma tus cambios o guárdalos antes de que puedas cambiar de rama".
dsharew
1
@DegenSharew: Sí, tiene razón en algunos casos, a saber, si los archivos que ha modificado en el directorio de trabajo no son idénticos en mastery branch123. Ver mi respuesta editada.
Russel Dirks
1
Esto funciono muy bien para mi. Todavía no tenía una rama hecha, así que hice esto: git checkout -b newbranchname. Mis cambios aparecieron en esa rama por su cuenta.
dex3703
6

git stash es lo que necesitas

Una explicación completa se puede encontrar en Git-Tools-Stashing

Roee Gavirel
fuente
0

Como es posible crear una nueva rama pero no es posible pagar una rama existente mientras se extraen los archivos, encontré el siguiente truco usando una rama temporal para trabajar:

Este escenario funciona al menos con el complemento VS 2015 Git, pero lo más probable es que funcione con cualquier herramienta git.

  1. finalizar la compra y realizar cambios en los archivos en master (ups !, rama equivocada)
  2. cree una nueva rama "temp" (o cualquier nombre no utilizado que elija) del maestro. Los archivos desprotegidos ahora se desprotegerán en temp y no en master.
  3. registrar cambios en la temperatura (el maestro no ha sido tocado)
  4. Ahora todo está registrado y es posible verificar una sucursal existente. Echa un vistazo a la rama deseada (la rama en la que quería hacer los cambios para empezar) 3.5 Git Rebase
  5. fusionar temp a la rama deseada. Ahora los cambios están en la rama correcta.
  6. elimine la rama temporal ya que ya no es necesaria

EDITAR: descubrí que tendrá que realizar un rebase (git rebase --onto) de la rama temporal antes de realizar la fusión. De lo contrario, los cambios en master se incluirán en la fusión. Un paso adicional 3.5 arriba. Ver más sobre rebase aquí: https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Pasi
fuente
¿Podría por favor elaborar más su respuesta agregando un poco más de descripción sobre la solución que proporciona?
abarisone
Gracias por sus comentarios. Sin embargo, la solución es bastante simple y sigue el mismo principio que la solución "alijo" excepto que se usa una rama temporal en lugar del alijo. Esto es más conveniente al menos para los usuarios de Visual Studio ya que el complemento GIT no admite el alijo
Pasi