¿Se aplican los cambios de git stash a la nueva rama?


348

Estaba trabajando en la rama maestra, hice algunos cambios y luego los escondí. Ahora, mi maestro está en HEAD.

Pero ahora, quiero recuperar estos cambios, pero a una nueva rama que se ramifica desde la versión HEAD de la rama maestra.

Cómo hago esto ?


3
Creo que estás buscando esto? stackoverflow.com/questions/556923/…
zx1986

Respuestas:


505

¿El procedimiento estándar no funciona?

  • hacer cambios
  • git stash save
  • git branch xxx HEAD
  • git checkout xxx
  • git stash pop

Más corta:

  • hacer cambios
  • git stash
  • git checkout -b xxx
  • git stash pop

8
@sfletche si desea nombrar su alijo necesita guardar git alijo <nombre>, de lo contrario, como usted dice, es lo mismo que alijo git.
SgtPooki

55
Después de usar este enfoque, parece que si regresa a la rama anterior, los cambios escondidos han regresado. ¿Es posible tener solo los cambios escondidos en la nueva sucursal?
Thomas Higginbotham

Simplemente envíe sus cambios a la nueva sucursal.
ChrisR

2
@ThomasHigginbotham no, el directorio de trabajo es común entre las sucursales y se copia de una a otra cuando se pasa de una sucursal a otra. Para "lograr" lo que desea, generalmente hago diferentes escondites, agregando descripciones útiles con el git stash save "description"comando mencionado anteriormente; y luego en git clearla rama (para destruir el directorio de trabajo real) y luego git stash apply stash@{my_desired_stash}en la rama deseada (después de cambiar a eso git checkout <branch>obviamente). Sé que no es una solución real, pero es lo mejor que puedes hacer con git .
Kamafeather

También finalicé esto con git stash drop una vez que me comprometí
oddmeter

221

Como ya ha guardado sus cambios, todo lo que necesita es esta frase:

  • git stash branch <branchname> [<stash>]

De los documentos ( https://www.kernel.org/pub/software/scm/git/docs/git-stash.html ):

Crea y extrae una nueva rama llamada < BRANCHNAME > a partir del comprometen a la que el < alijo fue creado originalmente>, aplica los cambios registrados en < alijo > para el nuevo árbol de trabajo y el índice. Si eso tiene éxito, y < stash > es una referencia del formulario stash @ {< revision >}, entonces deja caer el < stash >. Cuando no se proporciona < stash >, se aplica el último.

Esto es útil si la rama en la que ejecutó git stash save ha cambiado lo suficiente como para que la aplicación de git stash falle debido a conflictos. Dado que el alijo se aplica encima del commit que era HEAD en el momento en que se ejecutó git stash, restaura el estado escondido originalmente sin conflictos.


3
Para los escondites individuales, este es el camino a seguir. La referencia de nombre de alijo no es necesaria ya que Git aplicará el último alijo, cambiará a una nueva rama y aplicará alijo en 1 comando.
sinisterOrange

@RodneyGolpe ¿Esto parece aplicar también el alijo a 'maestro'? Lo que quiero hacer es, desde 'master', git stash, ¿entonces hubiera esperado que 'git stash branch [nombre de la sucursal] aplicara el alijo a una nueva rama, dejando al maestro sin las ediciones?
David Doria el

2
@DavidDoria Debe confirmar los cambios en su nueva sucursal antes de volver a master.
Rodney Golpe

Ahora que también comprometió los cambios para dominar ... Estoy realmente perdido ... obviamente todavía no entiendo realmente git. Después de reiniciar el software maestro y luego sacarlo del repositorio remoto, ahora estoy donde quería estar. El maestro está en el estado anterior a los cambios. La nueva sucursal contiene los cambios.
Ekkstein

1

Si tiene algunos cambios en su espacio de trabajo y desea guardarlos en una nueva rama, use este comando:

git stash branch branchName

Esto lo hara:

  1. una nueva sucursal
  2. mover cambios a esta rama
  3. y eliminar el último alijo (como: git stash pop)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.