unstash - git-stash vs. git-branch
que significa stash en git (4)
''stash'' toma las cosas " sucias " no comprometidas en su copia de trabajo y las esconde, dejándole una copia de trabajo limpia.
Realmente no se ramifica en absoluto. A continuación, puede aplicar el alijo en la parte superior de cualquier otra rama. O, a partir de Git 1.6, puedes hacer:
git stash branch <branchname> [<stash>]
para aplicar el alijo en la parte superior de una nueva rama, todo en un solo comando.
Entonces, el escondite funciona muy bien si aún no te has comprometido con la rama " incorrecta ".
Si ya se ha comprometido, el flujo de trabajo que describe en su pregunta es una mejor alternativa. Y por cierto, tiene razón: Git es muy flexible, y con esa flexibilidad viene la funcionalidad superpuesta.
En una pregunta previa de Git , Daniel Benamy estaba hablando de un flujo de trabajo en Git:
Estaba trabajando en master y comprometido algunas cosas y luego decidí que quería poner ese trabajo en espera. Hice una copia de seguridad de algunas confirmaciones y luego me ramifiqué antes de comenzar mi trabajo de mierda.
Quería restaurar su estado de trabajo a un punto anterior en el tiempo sin perder sus cambios actuales. Todas las respuestas giraron en torno a, de varias maneras, algo así como
git branch -m master crap_work
git branch -m previous_master master
¿Cómo se compara esto con git stash
? Estoy un poco confundido tratando de ver cuál es el caso de uso diferente aquí, cuando parece que todo lo que hace git stash
ya lo maneja la ramificación ...
@ Jordi Bunster : Gracias, eso aclara las cosas. Supongo que consideraría que "esconderse" es como una rama liviana y sin nombre. Entonces cualquier cosa puede hacer, la rama también puede hacerlo con más palabras. ¡Bonito!
Cuando restaura su escondite, los cambios se vuelven a aplicar y continúa trabajando en su código.
Para esconder tus cambios actuales
$ git stash save
Saved "WIP on master: e71813e..."
También puede tener más de un escondite. El alijo funciona como una pila. Cada vez que guardas un nuevo alijo, se coloca en la parte superior de la pila.
$ git stash list
stash@{0}: WIP on master: e71813e..."
Tenga en cuenta la parte stash@{0}
? Esa es tu identificación de escondite. Lo necesitarás para restaurarlo más adelante. Hagámoslo ahora La identificación del escondite cambia con cada alijo que haces. stash @ {0} se refiere al último alijo que hiciste.
Para aplicar un alijo
$ git stash apply stash@{0}
Puede notar que el alijo sigue ahí después de haberlo aplicado. Puede soltarlo si no lo necesita más.
$ git stash drop stash@{0}
O bien, como el escondite actúa como una pila, puedes sacar el último alijo que guardaste:
$ git stash pop
Si quiere borrar todos sus escondites, ejecute el comando ''borrar'':
$ git stash clear
Es muy posible que no uses escondites tan a menudo. Si solo quiere esconder rápidamente los cambios para restaurarlos más tarde, puede omitir la identificación del escondite.
$ git stash
...
$ git stash pop
Siéntase libre de experimentar con el alijo antes de usarlo en algún trabajo realmente importante.
También tengo una versión más profunda de esto publicado en mi blog .
Si busca un flujo de trabajo que pueda ser más apropiado que git stash, puede consultar git-bottle . Es una utilidad con el propósito de guardar y restaurar los diversos estados de trabajo de git como commit normal de git, instantáneamente capturando el estado actual y pertinente de su árbol de trabajo y todos los varios estados de archivo mostrados bajo el estado de git.
Diferencias clave de git stash
:
-
git stash
guarda el estado de git sucio por poco (archivos modificados y archivos agregados en el índice), mientras quegit-bottle
está diseñado para guardar todo lo que es diferente deHEAD
, y diferencia de manera conservadora entre modificado, modificado y no agregado, rutas no agregadas, no fusionadas y los estados completos de rebase / fusión (solo las rutas bajo.gitignore
no se guardan). -
git stash
guarda para guardar los objetos que necesita para realizar un seguimiento por separado. Si escondí algo hace 2 semanas, es posible que no lo recuerde, mientras quegit-bottle
guarda como compromisos tentativos para la rama actual . La acción inversa esgit-unbottle
que es el equivalente degit stash
pop. Es posible enviar y compartir estos commits entre los repositorios. Esto puede ser útil para construcciones remotas, donde tiene otro repositorio en un servidor remoto solo para construir, o para colaborar con otras personas en la resolución de conflictos.
Siempre tengo cuidado con git stash. Si escondes un par de veces, las cosas tienden a complicarse. git stash list mostrará una lista numerada de depósitos creados, con mensajes si los proporcionó ... Pero el problema radica en el hecho de que no se pueden limpiar los escondites excepto con un brutal escondite de git (que los elimina a todos) . Así que, a menos que siempre seas anal al dar mensajes súper descriptivos para tus escondites (algo va en contra de la filosofía de stash), terminas con un montón incomprensible de escondidas.
La única forma que conozco de averiguar cuál es cuál es usar gitk --todos y detectar los escondites. Al menos, esto te permite ver en qué se creó el alijo, así como la diferencia de todo lo incluido en ese alijo.
Tenga en cuenta que estoy usando git 1.5.4.3, y creo que 1.6 agrega git stash pop, lo que supongo aplicaría el alijo seleccionado y lo eliminaría de la lista. Lo cual parece mucho más limpio.
Por ahora, siempre trato de ramificarme a menos que esté absolutamente seguro de que voy a volver a ese alijo en el mismo día, incluso en una hora.