Stocker un seul fichier

177

J'aimerais pouvoir cacher uniquement les modifications d'un seul fichier:

git stash save -- just_my_file.txt

Ce qui précède ne fonctionne pas cependant. Des alternatives?

EoghanM
la source
pour un fichier unique , au lieu de jongler avec les commandes de stash, une approche beaucoup plus simple consiste à copier un seul fichier et lorsque vous souhaitez le ramener simplement à copier sur l'original. par exemple. cp just_my_file.txt just_my_file.txt.manualstash maintenant vous pouvez faire toutes les extractions et tout le reste et comme la copie est un "fichier non suivi", vous pouvez vous déplacer à travers les branches et commits sans aucun problème. Lorsque vous êtes sur la bonne branche / commit où vous voulez "fusionner le fichier unique ", faites-le mv just_my_file.txt.manualstash just_my_file.txtet maintenant vous pouvez revoir les modifications et les valider si nécessaire
Dimitry K

Réponses:

174

Je pense que stash -pc'est probablement le choix que vous voulez, mais juste au cas où vous rencontriez d'autres choses encore plus délicates à l'avenir, rappelez-vous que:

Stashest vraiment juste une alternative très simple aux seuls ensembles légèrement plus complexes branch. Stash est très utile pour déplacer rapidement les choses, mais vous pouvez accomplir des choses plus complexes avec des branches sans trop de maux de tête et de travail.

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

allez-y et faites ce que vous voulez, puis plus tard simplement rebaseet / ou mergele tmpbranch. Il est vraiment pas que beaucoup de travail supplémentaire de quand vous avez besoin de faire un suivi plus prudent que Stash permettra.

Wes Hardaker
la source
2
À la hausse, vous pouvez transformer les cachettes en vraies branches sans une énorme douleur.
Wes Hardaker
90

Si vous ne souhaitez pas spécifier de message avec vos modifications cachées, passez le nom de fichier après un double tiret.

$ git stash -- filename.ext

S'il s'agit d'un fichier non suivi / nouveau, vous devrez d'abord le mettre en scène.

Toutefois, si vous ne voulez spécifier un message, l' utilisation push.

git stash push -m "describe changes to filename.ext" filename.ext

Les deux méthodes fonctionnent dans les versions 2.13+ de git

Sealocal
la source
1
Cette réponse semble le plus droit devant moi quand la prise de modifier les changements: git stash -- filename.ext, git commit --amend, git stash pop
Brandon Dewey
1
Je pense que cela doit reposer sur des fonctionnalités très nouvelles. Cela ne fonctionne pas dans git 2.1.4.
Richard Smith
Cela se traduit par un comportement étrange pour moi, avec la sauvegarde en cours de sauvegarde, mais les mêmes fichiers sont ajoutés à la mise en scène en même temps (git v2.20.1),
paradroid
58

Vous pouvez cacher de manière interactive des lignes simples avec git stash -p(analogue à git add -p).

Cela ne prend pas de nom de fichier, mais vous pouvez simplement sauter d'autres fichiers avec djusqu'à ce que vous atteigniez le fichier que vous voulez cacher et que tous les changements y soient modifiés a.

Benjamin Bannier
la source
3
Cela prend beaucoup de temps si vous avez beaucoup de fichiers que vous ne voulez pas cacher.
jjj
23
Je ne sais pas quand cela a changé, mais à partir de git 2.14.1vous pouvez spécifier le nom du fichiergit stash -p <filename>
muon
21

La meilleure option est de tout mettre en scène sauf ce fichier, et de dire à stash de conserver l'index avec git stash save --keep-index, en cachant ainsi votre fichier non organisé:

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

Comme le fait remarquer Dan, thefiletostashest le seul à être réinitialisé par le cache, mais il cache également les autres fichiers, donc ce n'est pas exactement ce que vous voulez.

CharlesB
la source
2
Bien que cela garde l'index dans le même état, cela ne cache-t-il pas également les fichiers qui se trouvent dans l'index? En d'autres termes, si après avoir fait cela, vous validez l'index dans la branche actuelle, puis passez à une autre branche et le faites git stash pop, cela ne va-t-il pas appliquer tous les fichiers, pas seulement le fichier que nous voulions cacher?
Dan Molding le
@DanMoulding: vous avez tout à fait raison, je n'y ai pas pensé.
CharlesB
16

Juste au cas où vous entendiez réellement `` annuler les modifications '' chaque fois que vous utilisez `` git stash '' (et n'utilisez pas vraiment git stash pour le cacher temporairement), dans ce cas, vous pouvez utiliser

git checkout -- <file>

Notez que git stash est juste une alternative plus rapide et simple à la création de branches et aux tâches.

Devesh
la source
Je pense que c'est la meilleure réponse si vous souhaitez supprimer toutes vos modifications modifiées dans un seul fichier.
Mohamed Haseel le
et je voudrais que ce soit la meilleure réponse pour cette tâche particulière
Zakir hussain
6
La question était assez claire et ne demandait pas comment rétablir les modifications apportées à un fichier. Voté contre.
Richard Smith
@MukulJain J'avais en fait besoin d'utiliser le stash-per-file de manière très temporaire (en gros séparant certains changements en deux commits qui affectaient les mêmes lignes, pour un fichier). Je ne voterai pas vraiment contre, mais je dirai simplement que cela ne me sert à rien.
Paul Stelian