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?

Michael Dorst
fuente
Misma pregunta: stackoverflow.com/q/6315459/350384
Mariusz Pawelski
¿Responde esto a tu pregunta? ¿Comando Git para guardar un alijo sin modificar el árbol de trabajo?
Mariusz Pawelski
1
@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:

$ git add modified-file.txt
$ git stash push --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 paragit stash o desde git-scm :

Si --keep-indexse utiliza la opción, todos los cambios ya agregados al índice se dejan intactos.

Cirelli94
fuente
3
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).

loco
fuente
1
Además, ¿cuál es la diferencia entre git stash; git stash applyy git stash && git stash apply?
Michael Dorst
2
@anthropomorphic git config --global alias.sta "!git stash && git stash apply"debería hacerlo.
¿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"
Premchandra Singh
fuente
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.

KenIchi
fuente
2

Puede usar git stash createpara crear una confirmación de ocultación y luego guardarla en la ocultación usando git stash store:

git stash store $(git stash create) -m "Stash commit message"

Esto se puede guardar en un alias git para que sea más conveniente:

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

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".

M. Justin
fuente
1
¡¡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.
Tanius