¿Por qué el git stash no es único por rama?

81

Supongo que permite mover cambios de una rama a la siguiente, pero para eso está la selección selectiva y, si no está realizando una confirmación de los cambios, tal vez no debería moverlos.

En ocasiones, apliqué el alijo incorrecto en la rama incorrecta, lo que me dejó preguntándome sobre esta pregunta.

iros
fuente
13
A Git le falta algo que le permite asociar cambios no confirmados con una rama (o cabeza). Esto se hace evidente cuando tiene trabajo en progreso para más de una rama a la vez. No obstante, como señalan las respuestas aquí, stash tiene aplicaciones útiles basadas en sus características. git stash-here¿nadie?
Blake Taylor

Respuestas:

69

Como se mencionó, si desea un "alijo por rama", realmente desea una nueva rama que se bifurque de la rama existente.

Además, además del hecho ya mencionado de que el alijo le permite ingresar a una rama en la que está trabajando, también le permite cambiar de rama antes de haber comprometido todo. Esto es útil no tanto para la selección selectiva en el sentido habitual como para la selección selectiva de su copia de trabajo .

Por ejemplo, mientras trabajo en una rama de funciones, a menudo noto errores menores o impurezas cosméticas en el código que no son relevantes para esa rama. Bueno, los arreglo de inmediato. Cuando llega el momento de comprometerme, realizo selectivamente los cambios relevantes, pero no las correcciones y los cosméticos. En su lugar, los guardo, lo que me permite cambiar a mi rama de arreglos menores en estable, donde luego puedo aplicar el alijo y confirmar cada arreglo menor por separado. (En función de los cambios en cuestión, también voy a esconder algunos de ellos una vez más, para cambiar a una rama de la característica diferente, donde aplico los .)

Esto me permite profundizar en el modo de programación cuando estoy trabajando y no preocuparme por la biblioteca adecuada de mi código. Luego, cuando tomo un descanso mental, puedo volver atrás y ordenar cuidadosamente mis cambios en los estantes correctos.

Si el alijo no fuera global, este tipo de flujo de trabajo sería mucho más difícil de realizar.

Aristóteles Pagaltzis
fuente
4
No estoy de acuerdo con esto: As mentioned, if you want a “per-branch stash,” you really want a new branch forking off from the existing branch.. En particular, a menudo cambio entre dos versiones del mismo programa, y ​​ejecutar una completa maketoma 10 minutos; Ser capaz de guardar los binarios construidos, por rama, sería muy bueno. Y ciertamente no quiero los binarios en el registro o en una rama.
Clément
¿Por qué? (Creo que sí, simplemente no lo sabe.)
Aristóteles Pagaltzis
21

A partir de Git 1.6, ahora puede aplicar alijos a las ramas usando

git stash branch name_of_new_branch

Git creará la nueva rama por ti, ¡y compruébalo! Para más información, ver

Supongo que puedes mover escondites usando

git stash branch <branch | new_branch> [<stash>]

y para ver una lista de tus alijos, usa

git stash list

Referencia

iGbanam
fuente
¡Gracias! No sabía que se podían aplicar escondites a las ramas, pero este parece ser el comportamiento después de todo. Teniendo un escondite en una rama, revisé otra rama e hice algunos trabajos allí. Al final resultó que necesitaba esconder algunos de sus cambios pendientes también antes de poder cambiar la base a master. Mi " gitk --all" actualizado ya no mostraba mi primer alijo; Pensé que podría ser aplastado. Una vez que terminé mi trabajo en la segunda rama, saqué ese alijo. Después de eso, mi " gitk --all" actualizado mostró el alijo original nuevamente.
Daniel Miladinov
17

si desea un "alijo" que se ejecute en una rama, haga algo como esto para almacenar sus cambios en una nueva rama de su rama actual.

git checkout -b new_stash
git commit -a -m "stashed changes"

deshacer el alijo

git reset HEAD^
git branch -d new_stash

git stash es especialmente útil porque puede introducir cambios en un árbol sucio, es decir, si tiene ediciones pendientes y desea hacer una

git pull

y no puede, puede guardar sus cambios, extraer y luego aplicar el alijo

git stash
git pull
git stash apply
git stash clear

espero que esto ayude!

Patrick_O
fuente
¿Qué pasa si las cosas que estás intentando esconder son, por ejemplo, un montón de binarios que resultaron de ejecutarse makeen esa rama? (un alijo por rama ahorraría tiempo la próxima vez que haga una compilación incremental en esa rama, pero ciertamente no desea agregar los binarios al índice)
Clément
5

git-stash es más útil para mí para mover los cambios que aún no se han registrado a una rama diferente a la que está actualmente extraída.

Por ejemplo, a menudo me encuentro haciendo cambios simples en una rama de corrección de errores; solo para descubrir que un cambio en el que estoy trabajando es más complejo de lo que supuse al principio. Git-stash es la forma más fácil de mover ese conjunto de cambios a una rama diferente.


fuente