Tomar todos mis cambios en la rama actual y moverlos a una nueva rama en Git

105

Comencé a trabajar en lo que pensé que sería una corrección de errores menores en mi rama maestra. Sin embargo, se ha salido de control hasta el punto en que desearía haber creado una rama separada para hacer el desarrollo en primer lugar.

Así que ahora mismo lo que me gustaría hacer es:

  1. Crea una nueva rama llamada (digamos) "borde"
  2. Mueva todos los archivos modificados / sin seguimiento del maestro al borde (de modo que el maestro no haya cambiado desde que comencé la corrección de errores)
  3. Terminar mi trabajo al límite, fusionarme con el maestro

¿Cómo puedo hacer esto?

Tom Lehman
fuente

Respuestas:

103

Si aún no ha cometido nada, ya está en la posición correcta.

  1. Crea una nueva rama: git checkout -b edge
  2. Tus archivos no han cambiado. Solo git addlo que necesita y comprometerse como de costumbre.
  3. Cuando haya terminado de comprometerse edge, vuelva a mastercon git checkouty git merge edge.
JB.
fuente
No había cometido nada todavía, por lo que la primera línea fue una vista bienvenida ... uf, en realidad fue bastante indoloro :-)
Drenai
87

Para añadir a la respuesta de JB, si ha ya comenzado a hacer algunas confirmaciones de maestro para lo que terminó por ser un esfuerzo de "borde", usted podría:

git stash
git checkout -b edge master
git branch -f master SHA1_before_your_commits
git stash apply
VonC
fuente
el contenedor de alijo no es estrictamente necesario, sino solo para cambios de trabajo no comprometidos, ¿verdad?
HaveAGuess
4
@HaveAGuess derecho. Al "tomar todos mis cambios", también incluí los cambios actuales que aún no se agregaron. De ahí el alijo.
VonC
¿No podrían colapsarse la segunda y tercera líneas en "git checkout -b edge master"?
Paul Lynch
@PaulLynch teniendo en cuenta esas confirmaciones (en master) que debe estar en edge son en mastersí. He editado la respuesta.
VonC
No veo cómo git stashes útil aquí, ya que el uso git checkout -bno modifica el árbol de trabajo en absoluto ...
user1686
13

Si está tratando de mover el trabajo de master a una rama que ya existe, pero está detrás de master, git no le permitirá cambiar a la otra rama. En este caso, haz esto:

git stash
git checkout oldBranch
git merge master
git checkout master
git stash apply
git checkout oldBranch
Jesse P
fuente