Guarde los cambios mientras mantiene los cambios en el directorio de trabajo en Git
145
¿Existe un git stashcomando que oculta sus cambios, pero también los mantiene en el directorio de trabajo? Entonces, básicamente, ¿ git stash; git stash applyen un solo paso?
@MariuszPawelski No, en realidad no. Esa pregunta es más específica que la mía. La respuesta a mi pregunta fue simplemente "no". Sin embargo, gracias por el enlace, puede ser útil para algunas personas, o incluso para mí más adelante.
Michael Dorst
Para ser claros, mi pregunta es diferente porque no tengo el requisito de que los archivos permanezcan intactos. Simplemente estaba buscando alternativas a git stash && git stash apply. Notarás que las respuestas a esa pregunta son bastante diferentes a las mías.
Michael Dorst
Ah, claro, tu pregunta es un poco menos específica. Pero formulé esa pregunta porque sus respuestas también cumplen con su requisito. Y de esa manera, esta pregunta aparece como "Vinculada" en la barra lateral, por lo que podría ser útil para alguien.
Mariusz Pawelski
Respuestas:
156
Para lo que vale, otra forma de hacer esto es organizar los cambios que desea mantener y luego guardar todo usando --keep-index:
Esta es, con mucho, la explicación más directa de --keep-index que he visto. No entendí el significado por la forma en que estaba redactado en los documentos.
40 detectives
52
git stashy luego git stash apply( git stash && git stash apply) guardará los archivos y los aplicará inmediatamente después. Entonces, después de todo, tendrá sus cambios en el alijo y en el directorio de trabajo.
Puede crear un alias si lo desea en una sola pieza. Solo pon algo como esto para ~/.gitconfig:
[alias]
sta = "!git stash && git stash apply"
El inconveniente de este enfoque es que todos los archivos se almacenan y recrean. Esto significa que las marcas de tiempo en los archivos en cuestión se cambiarán. (Causando que Emacs se queje cuando intento guardar el archivo si lo abrí antes de hacerlo git sta, y puede causar reconstrucciones innecesarias si está usando makeo amigos).
¿Cómo puedo modificar este alias para usarlo git stash savecon un argumento y luego hacerlo git stash apply?
spinningarrow
1
@ JaySidri, explosión significa que en realidad es un comando externo, no un argumento git en sí mismo. Según los documentos : "Como se puede ver, Git simplemente reemplaza el nuevo comando por el alias. Sin embargo, tal vez desee ejecutar un comando externo, en lugar de un subcomando Git. En ese caso, inicia el comando con un ! personaje."
loco
10
Una pequeña mejora en la respuesta que en la práctica puede usar.
$ git add modified-file.txt
(OR $ git add . ---- for all modified file)
$ git stash save --keep-index "Your Comment"
NOTA: no funciona sin "git add" (por ejemplo, para archivos modificados pero no agregados para confirmar)
alex_1948511
4
Hay un truco que puede ayudarte, no esconder cosas, sino FWIW:
git add -A
git commit -m "this is what's called stashing" (create new stash commit)
git tag stash (mark the commit with 'stash' tag)
git reset HEAD~ (Now go back to where you've left with your working dir intact)
Entonces, ahora que tiene un alijo etiquetado de confirmación a su disposición, no es posible hacerlo de git stash poptodos modos, pero puede hacer cosas como crear parches o restablecer archivos, etc. a partir de ahí, sus archivos de directorio de trabajo también quedan intactos.
Tenga en cuenta que esto no hace todo lo que git stash pushhace. Por ejemplo, no agrega el nombre de la rama a la confirmación, por ejemplo, " stash@{0}: On myBranch: Stash commit message".
¡¡Amo esta!! Sin embargo, una corrección: man git-stashdice que -m <message>tiene que venir antes del commit hash. Excepto que algo cambia en el nuevo git.
git stash && git stash apply
. Notarás que las respuestas a esa pregunta son bastante diferentes a las mías.Respuestas:
Para lo que vale, otra forma de hacer esto es organizar los cambios que desea mantener y luego guardar todo usando
--keep-index
:Los comandos anteriores guardarán todo, pero dejarán los archivos almacenados en su directorio de trabajo.
Desde el oficial de Linux Kernel Git para
git stash
o desde git-scm :fuente
git stash
y luegogit stash apply
(git stash && git stash apply
) guardará los archivos y los aplicará inmediatamente después. Entonces, después de todo, tendrá sus cambios en el alijo y en el directorio de trabajo.Puede crear un alias si lo desea en una sola pieza. Solo pon algo como esto para
~/.gitconfig
:El inconveniente de este enfoque es que todos los archivos se almacenan y recrean. Esto significa que las marcas de tiempo en los archivos en cuestión se cambiarán. (Causando que Emacs se queje cuando intento guardar el archivo si lo abrí antes de hacerlo
git sta
, y puede causar reconstrucciones innecesarias si está usandomake
o amigos).fuente
git stash; git stash apply
ygit stash && git stash apply
?&&
ejecuta el segundo comando solo si primero devolvió el código de estado cero .git config --global alias.sta "!git stash && git stash apply"
debería hacerlo.git stash save
con un argumento y luego hacerlogit stash apply
?Una pequeña mejora en la respuesta que en la práctica puede usar.
fuente
Hay un truco que puede ayudarte, no esconder cosas, sino FWIW:
Entonces, ahora que tiene un alijo etiquetado de confirmación a su disposición, no es posible hacerlo de
git stash pop
todos modos, pero puede hacer cosas como crear parches o restablecer archivos, etc. a partir de ahí, sus archivos de directorio de trabajo también quedan intactos.fuente
Puede usar
git stash create
para crear una confirmación de ocultación y luego guardarla en la ocultación usandogit stash store
:Esto se puede guardar en un alias git para que sea más conveniente:
Tenga en cuenta que esto no hace todo lo que
git stash push
hace. Por ejemplo, no agrega el nombre de la rama a la confirmación, por ejemplo, "stash@{0}: On myBranch: Stash commit message
".fuente
man git-stash
dice que-m <message>
tiene que venir antes del commit hash. Excepto que algo cambia en el nuevo git.