¿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 ?

Yash Desai
fuente
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
Andrejs Cainikovs
fuente
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.

Rodney Golpe
fuente
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)
Hamed Yarandi
fuente