Git stash uncached: comment ranger tous les changements non mis en scène?

96

Supposons que deux ensembles de modifications soient effectués dans un projet versionné par git. Un ensemble est mis en scène et l'autre ne l'est pas.

Je voudrais revérifier les modifications par étapes en exécutant mon projet dans cet état (avant la validation). Quel est un moyen simple de ranger toutes les modifications non programmées et de ne les laisser que par étapes? J'ai donc besoin que les modifications non mises en scène disparaissent de mon projet, mais soient stockées quelque part pour un travail ultérieur.

Cela ressemble beaucoup à une git stashcommande. Mais git stashmettrait à la fois les changements non mis en scène et par étapes loin de mon projet. Et je ne trouve pas quelque chose comme git stash uncached.

klm123
la source
À partir d'aujourd'hui, avec mon git 2.21, il n'y a toujours pas de bonne réponse à cela. Toutes les réponses ci-dessous sont soit incorrectes ( -koption), soit fastidieuses à utiliser.
Penghe Geng

Réponses:

99

Mise à jour 2:
Je ne sais pas pourquoi les gens se plaignent de cette réponse, cela semble fonctionner parfaitement avec moi, pour les fichiers non extraits, vous pouvez ajouter le -udrapeau

La commande complète devient git stash --keep-index -u

Et voici un extrait de l' git-stashaide

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

Si l'option --include-untracked est utilisée, tous les fichiers non suivis sont également stockés puis nettoyés avec git clean, laissant le répertoire de travail dans un état très propre. Si l'option --all est utilisée à la place, les fichiers ignorés sont stockés et nettoyés en plus des fichiers non suivis.

Et ceci est un gif de son apparence:

entrez la description de l'image ici

Mettre à jour:

Même si c'est la réponse choisie, beaucoup ont souligné que la [réponse ci-dessous] (https://stackoverflow.com/a/34681302/292408) est la bonne, je recommande de la vérifier.

J'ai testé à nouveau ma réponse aujourd'hui (31/1/2020) par rapport à la version git 2.24.0, et je pense toujours que c'est correct, j'ai ajouté une petite note ci-dessus à propos des fichiers non suivis. Si vous pensez que cela ne fonctionne pas, veuillez également mentionner votre version de git.

Ancienne réponse :
si l' --keep-indexoption est utilisée, toutes les modifications déjà ajoutées à l'index sont laissées intactes:

git stash --keep-index

De la documentation degit-stash :

Test des commits partiels

Vous pouvez utiliser git stash save --keep-indexlorsque vous souhaitez effectuer deux ou plusieurs validations à partir des modifications de l'arborescence de travail et que vous souhaitez tester chaque modification avant de valider:

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

Mais, si vous souhaitez uniquement vérifier visuellement les modifications par étapes, vous pouvez essayer difftool:

git difftool --cached
Mohammad AbuShady
la source
4
voir aussi git stash [-p|--patch]ce qui ressemble à un stockage interactif. De man git stash"Avec --patch, vous pouvez sélectionner de manière interactive des morceaux de la différence entre HEAD et l'arbre de travail à cacher."
ici
1
J'ai l'habitude add -p, checkout -pet je reset -pn'ai jamais essayé stash -p, merci pour le conseil: D
Mohammad AbuShady
19
Notez que cette réponse masquera également les modifications que vous avez préparées.
Ben Flynn
1
Cette réponse n'est pas vraiment utile car elle entraînera de la confusion. Cette réponse est meilleure stackoverflow.com/a/34681302/292408 .
Elijah Lynn
1
@ElijahLynn J'ai lié à l'autre réponse depuis que j'ai trouvé beaucoup de gens disant que c'est la meilleure réponse, merci pour votre commentaire
Mohammad AbuShady
102

La réponse acceptée cache également des changements par étapes, comme quelques-uns l'ont souligné. Voici un moyen de le faire sans obtenir vos modifications par étapes dans la réserve.

L'idée est de faire une validation temporaire de vos modifications par étapes, puis de cacher les modifications non organisées, puis de désactiver la validation temporaire:

# temp commit of your staged changes:
$ git commit --message "WIP"

# -u option so you also stash untracked files
$ git stash -u

# now un-commit your WIP commit:
$ git reset --soft HEAD^

À ce stade, vous aurez une réserve de vos modifications non préparées et vous n'aurez que vos modifications par étapes présentes dans votre copie de travail.

stephen.hanson
la source
22
C'est vraiment la bonne réponse IMO. L' --keep-indexoption dans la réponse acceptée actuelle bloque toujours ce qui se trouve dans l'index, elle le conserve également dans l'index. Alors c'est dupliqué, et l'hilarité s'ensuit.
Ken Williams le
4
@KenWilliams <del> hilarité </del> <ins> tragédie </ins>
tuespetre
@KenWilliams Cela m'a vraiment énervé. OP pouvez-vous s'il vous plaît ajuster la réponse sélectionnée?
MikeMurko
2
L' git add .étape pourrait souhaiter être améliorée git add --allcar cela devrait également saisir les fichiers dans un répertoire au-dessus du répertoire de travail actuel.
Elijah Lynn
1
C'est la meilleure réponse à ce jour, car l'option --keep-index dans la réponse acceptée est trompeuse. Cela devrait être la réponse acceptée.
Elijah Lynn
21

J'ai trouvé que la réponse marquée ne fonctionnait pas pour moi car j'avais besoin de quelque chose qui ne cachait vraiment que mes modifications non mises en scène. La réponse marquée git stash --keep-index,, bloque les modifications par étapes et non. La --keep-indexpièce laisse simplement l'index intact sur la copie de travail. Cela fonctionne pour OP, mais uniquement parce qu'il a posé une question légèrement différente de celle pour laquelle il voulait réellement la réponse.

Le seul vrai moyen que j'ai trouvé pour cacher les modifications non mises en scène est de ne pas utiliser du tout la réserve:

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .fonctionnera également à la place de apply -R.

Travail Travail travail...

git apply unstaged.diff
rm unstaged.diff
Phile binaire
la source
1
Ici git version 2.6.1.windows.1, git stash -ktravaillé comme décrit.
koppor
Cela devrait être la réponse acceptée! C'est le seul dans plusieurs threads stackoverflow qui fait ce qu'il prétend et ne compte pas sur les validations temporaires!
user643011
1
@ user643011: Les validations temporaires ne sont pas une mauvaise chose dans git. Ils ne coûtent rien et ne font de mal à personne.
Fritz
1
@Fritz: aucune validation temporaire n'est possible dans certains scénarios. Cela peut échouer si vous avez un hook de pré-validation qui vérifie le code de travail actuel. Si vos modifications par étapes sont bonnes mais que vos modifications non par étapes ne le sont pas, cette approche échouera à valider les modifications par étapes.
Penghe Geng
1
Cela n'inclut pas les fichiers non suivis. Vous devez utiliser "git ls-files" pour trouver et inclure ceux-ci dans le patch de diff
ACyclique
5

Git: Stash les modifications non organisées

Cela cachera toutes les modifications que vous n'avez pas ajoutées:

git stash -k

Notez que les fichiers nouvellement créés (et non ajoutés) resteront dans votre répertoire de travail à moins que vous n'utilisiez également le -ucommutateur.

git stash -k -u 

De plus, votre répertoire de travail doit être propre (c'est-à-dire que toutes les modifications doivent être ajoutées) lorsque vous git stash pop plus tard.

http://makandracards.com/makandra/853-git-stash-unstaged-changes

Cory Danielson
la source
13
C'est équivalent à git stash --keep-index. Les fichiers intermédiaires sont inclus dans la réserve.
Benjamin Cheah