Stocker les modifications tout en conservant les modifications dans le répertoire de travail de Git

146

Existe-t-il une git stashcommande qui bloque vos modifications, mais les conserve également dans le répertoire de travail? Donc, fondamentalement, un git stash; git stash applyen une seule étape?

Michael Dorst
la source
Même question: stackoverflow.com/q/6315459/350384
Mariusz Pawelski
Est-ce que cela répond à votre question? Commande Git pour enregistrer une cachette sans modifier l'arbre de travail?
Mariusz Pawelski
1
@MariuszPawelski Non, pas vraiment. Cette question est plus précise que la mienne. La réponse à ma question était simplement «non». Merci pour le lien, cela peut être utile à certaines personnes, voire à moi-même plus tard.
Michael Dorst
Pour être clair, ma question est différente car je n'ai aucune exigence que les fichiers restent intacts. Je cherchais simplement des alternatives git stash && git stash apply. Vous remarquerez que les réponses à cette question sont assez différentes des miennes.
Michael Dorst
ah, c'est vrai, votre question est un peu moins précise. Mais j'ai posé cette question parce que ses réponses répondent également à votre exigence. Et de cette façon, cette question apparaîtra comme "Liée" dans la barre latérale, elle pourrait donc être utile à quelqu'un.
Mariusz Pawelski

Réponses:

157

Pour ce que cela vaut, une autre façon de le faire est de mettre en scène les modifications que vous souhaitez conserver, puis de tout cacher en utilisant --keep-index:

$ git add modified-file.txt
$ git stash push --keep-index

Les commandes ci-dessus cacheront tout, mais laisseront les fichiers mis en scène dans votre répertoire de travail.

De la documentation officielle du noyau Linux Git pourgit stash ou depuis git-scm :

Si l' --keep-indexoption est utilisée, toutes les modifications déjà ajoutées à l'index sont laissées intactes.

Cirelli94
la source
3
c'est de loin l'explication la plus simple de --keep-index que j'ai vue. Je n'ai pas compris tout à fait le sens de la façon dont il était formulé sur les documents.
40détectives
52

git stashpuis git stash apply( git stash && git stash apply) cachera les fichiers et appliquera la sauvegarde immédiatement après. Donc, après tout, vous aurez vos modifications dans la réserve et dans le répertoire de travail.

Vous pouvez créer un alias si vous le souhaitez en un seul morceau. Mettez simplement quelque chose comme ça à ~/.gitconfig:

[alias]
    sta = "!git stash && git stash apply"

L'inconvénient de cette approche est que tous les fichiers sont stockés et recréés. Cela signifie que les horodatages des fichiers en question seront modifiés. (Faire en sorte qu'Emacs se plaint lorsque j'essaie de sauvegarder le fichier s'il l'a ouvert avant de le faire git sta, et peut entraîner des reconstructions inutiles si vous utilisez makeou des amis.)

taré
la source
1
aussi, quelle est la différence entre git stash; git stash applyet git stash && git stash apply?
Michael Dorst
2
@anthropomorphic git config --global alias.sta "!git stash && git stash apply"devrait le faire.
Comment puis-je modifier cet alias pour l'utiliser git stash saveavec un argument, puis le faire git stash apply?
spinningarrow
1
@JaySidri, bang signifie qu'il s'agit en fait d'une commande externe, pas d'un argument git lui-même. Selon la documentation : "Comme vous pouvez le voir, Git remplace simplement la nouvelle commande par celui pour lequel vous l'aliasez. Cependant, vous souhaitez peut-être exécuter une commande externe, plutôt qu'une sous-commande Git. Dans ce cas, vous démarrez la commande avec un ! personnage."
madhead
10

Une petite amélioration de la réponse qui, dans la pratique, peut être utile.

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"
Premchandra Singh
la source
NOTE: ne fonctionne pas sans "git add" (par exemple pour les fichiers modifiés mais non ajoutés aux commit)
alex_1948511
4

Il y a une astuce qui peut vous aider, non pas pour cacher mais 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)

Et donc maintenant que vous avez une cachette étiquetée de commit à votre disposition, il n'est pas possible d'en faire de git stash poptoute façon, mais vous pouvez faire des choses comme créer un correctif ou réinitialiser des fichiers, etc. à partir de là, vos fichiers de répertoire de travail sont également laissés intacts BTW.

KenIchi
la source
3

Vous pouvez utiliser git stash createpour créer un commit stash, puis l'enregistrer dans le stash en utilisant git stash store:

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

Cela peut être enregistré dans un alias git pour le rendre plus pratique:

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

git stash-keep -m "Stash commit message"

Notez que cela ne fait pas tout ce qui git stash pushfait. Par exemple, il n'ajoute pas le nom de la branche au commit, par exemple " stash@{0}: On myBranch: Stash commit message".

M. Justin
la source
1
J'aime celui-ci!! Une correction cependant: man git-stashdit que le -m <message>doit venir avant le hachage de validation. Sauf que quelque chose a changé dans le dernier git.
tanius le