1966 votes

Comment puis-je mettre en cache un fichier spécifique dans git ?

Comment puis-je mettre en mémoire un fichier spécifique en laissant les autres fichiers modifiés en dehors de la mémoire que je suis sur le point de sauvegarder ?

Par exemple, si git status me donne ceci :

younker % gst      
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   app/controllers/cart_controller.php
#   modified:   app/views/cart/welcome.thtml
#
no changes added to commit (use "git add" and/or "git commit -a")

et je veux seulement cacher app/views/cart/welcome.thtml, comment dois-je faire ? Quelque chose comme (mais bien sûr cela ne fonctionne pas) :

git stash save welcome_cart app/views/cart/welcome.thtml

65 votes

La question "duplicata possible" a actuellement une réponse incorrecte marquée comme acceptée.

8 votes

Vous pouvez utiliser git checkout -- filename et le ramener à son état d'origine.

10 votes

@visualex il va en effet le rétablir, mais pas le cacher.

2867voto

svick Points 81772

EDIT : Depuis git 2.13, il existe une commande permettant de sauvegarder un chemin spécifique dans la cachette : git stash push <path> . Par exemple :

git stash push -m welcome_cart app/views/cart/welcome.thtml

ANCIENNE RÉPONSE :

Vous pouvez le faire en utilisant git stash --patch (ou git stash -p ) - vous entrerez dans le mode interactif où chaque morceau qui a été modifié vous sera présenté. Utilisez n pour sauter les dossiers que vous ne voulez pas mettre de côté, y quand vous rencontrez celui que vous voulez mettre de côté, et q d'arrêter et de laisser les morceaux restants non lavés. a va stocker le morceau montré et le reste des morceaux dans ce fichier.

Ce n'est pas l'approche la plus conviviale, mais elle permet de faire le travail si vous en avez vraiment besoin.

6 votes

La seule chose que cela ne semble pas faire est d'inclure les modifications apportées aux fichiers binaires. J'ai modifié quelques graphiques, j'ai fait la méthode git stash --patch et ils n'ont jamais été listés.

38 votes

Encombrant, mais efficace. J'aimerais qu'il y ait un moyen rapide de ne stocker que les modifications staged, puis de les placer dans l'arbre de travail unstaged lorsqu'il est ouvert plus tard.

66 votes

@JamesJohnston git stash --keep-index vous permettra de mettre de côté toutes les modifications non organisées (le contraire de ce que vous recherchez). stackoverflow.com/a/8333163/378253

358voto

skalee Points 3227

J'ajoute généralement à l'index les changements que je ne veux pas mettre en réserve, puis je mets en réserve avec --keep-index option.

git add app/controllers/cart_controller.php
git stash --keep-index
git reset

La dernière étape est facultative, mais en général, vous la voulez. Elle supprime les modifications de l'index.


Avertissement Comme indiqué dans les commentaires, git stash --keep-index pousse tout sur la cachette, avec ou sans mise en scène. Le site --keep-index laisse l'index seul une fois que la cachette est faite. Cela peut provoquer des conflits de fusion lorsque vous ouvrez la cachette plus tard.

5 votes

C'est bien mieux que la réponse acceptée si vous avez beaucoup de changements que vous ne voulez pas passer en revue avec l'option --patch.

194 votes

Non, cela met tout dans la cachette, avec ou sans scène. Le site --keep-index laisse juste l'index seul après que la cachette soit faite. Ce n'est donc pas une réponse valable à la question, AFAICT.

3 votes

Voir ma réponse à la question de @Rachel pour une solution permettant de faire l'inverse de ceci (stocker les modifications mises à disposition, au lieu des modifications non mises à disposition). stackoverflow.com/questions/3040833/

97voto

qiu Points 848

Pour ajouter à la réponse de svick, la -m L'option ajoute simplement un message à votre cachette, et est entièrement facultative. Ainsi, la commande

git stash push [paths you wish to stash]

est parfaitement valable. Ainsi, par exemple, si je souhaite ne conserver que les modifications dans la section src/ je peux juste lancer

git stash push src/

2 votes

NB : L'éclatement est fait sans le chemin, juste git stash pop .

16voto

Akshay Points 149

Si vous utilisez Visual Studio Code, il existe un moyen plus simple de cacher les fichiers sélectionnés.

  1. Allez dans l'onglet Contrôle de la source
  2. Sélectionnez les dossiers que vous voulez mettre de côté
  3. Faites un clic droit dessus, vous verrez plusieurs options. Cliquez sur Changements dans la cachette
  4. Maintenant, il vous demandera d'ajouter un message de cachette. Ajoutez un message compréhensible.

enter image description here enter image description here

0 votes

Le mien montre : jeter les modifications, mettre en scène les modifications, ajouter à gitignore. Pas de cachette

2 votes

@SomeoneSomewhere essayez d'utiliser l'extension GitLens

2 votes

Excellente solution pour de nombreux utilisateurs de vscode, plus besoin de manipuler des commandes.

6voto

Tom Points 392

Si vous n'avez pas encore de fichiers mis en scène, vous pouvez mettre temporairement en scène certains fichiers et les remettre en scène par la suite.

Par exemple, je voulais revenir en arrière sur tous les fichiers sauf un, alors j'ai fait quelque chose comme ça :

git add path/to/file/file.as //Add file I want to keep
git checkout -- *.as //revert all unstages .as files
git reset HEAD path/to/file/file.as

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X