3802 votes

Planquer qu’un seul fichier de plusieurs fichiers qui ont été modifiés avec Git ?

Comment est-ce que je peux planquer qu’une des multiples fichiers modifiés sur ma branche ?

3614voto

konrad.kruczynski Points 5938

Vous pouvez également utiliser `` . De cette façon, vous pouvez sélectionner quels hunks doit être ajoutée à planquer, programmable aussi bien les fichiers ensemble.

1406voto

bukzor Points 11085

Cela permettra de ranger tout ce que vous n'avez pas déjà ajouté. Juste git add les choses que vous voulez garder, puis l'exécuter.

git stash --keep-index

Par exemple, si vous souhaitez diviser un ancien commit en plus d'un ensemble de modifications, vous pouvez utiliser cette procédure:

  1. rebase -i <last good commit>
  2. Marque quelques modifications comme l' edit.
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. Fixer des choses comme nécessaire. N'oubliez pas d' git add tous les changements.
  7. git commit
  8. git stash pop
  9. De répétition, #5, en tant que de besoin.
  10. git rebase --continue

1070voto

VonC Points 414372

Depuis git est à la base sur la gestion d'un ensemble de référentiel de contenu et de l'index (et non un ou plusieurs fichiers), git stash traite, il n'est pas surprenant, avec le répertoire de travail.

L'original de la réponse (ci-dessous, juin 2010) a été manuellement en sélectionnant ce que vous voulez cachette.

Casebash commentaires:

Ce ( stash --patch solution originale) est agréable, mais souvent, j'ai modifié un grand nombre de fichiers, donc à l'aide de patch est ennuyeux

bukzor's réponse (upvoted, novembre 2011) suggère une solution plus pratique, basé sur
git add + git stash --keep-index.
Aller voir et upvote sa réponse, qui devrait être l'officielle (au lieu de la mienne).

À propos de cette option, chhh points d'un autre flux de travail dans les commentaires:

vous devez "git reset --soft" après une cachette pour obtenir votre mise en scène en arrière:
Afin d'obtenir à l'état d'origine - qui est clairement une zone de transit et avec seulement certains de l'onu de la scène modifications, on peut doucement réinitialiser l'index pour obtenir (sans commettre quelque chose comme vous - bukzor - a).


(Réponse originale à cette question juin 2010: manuel cachette)

Pourtant, git stash save --patch pourraient vous permet d'obtenir l'partielle accrocher vous êtes après:

Avec --patch, vous pouvez sélectionner de manière interactive les beaux mecs dans la diff entre la TÊTE et l'arbre de travail pour être cachée.
La cachette d'entrée est construit de telle manière que son indice de l'état est le même que l'indice de l'état de votre dépôt, et son worktree contient uniquement les modifications que vous avez sélectionnés de façon interactive. Les changements sélectionnés sont ensuite restaurée à partir de votre worktree.

Cependant, qui permettra d'économiser l'index complet (qui peut ne pas être ce que vous voulez, car il peut inclure d'autres fichiers déjà indexé), et d'une partie du worktree (ce qui pourrait ressembler à celui que vous souhaitez ranger).

git stash --patch --no-keep-index

peut-être un meilleur ajustement.


Si --patch ne fonctionne pas, un processus manuel peut:

Pour un ou plusieurs fichiers, une solution intermédiaire serait de:

  • copiez-les à l'extérieur du repo Git
    (En fait, eleotlecram propose une alternative intéressante)
  • git stash
  • copier
  • git stash # cette fois, uniquement les fichiers que vous souhaitez sont planqué
  • git stash pop stash@{1} # re-appliquer toutes les modifications de vos fichiers
  • git checkout -- afile # réinitialiser le fichier sur le contenu d'en-TÊTE, avant toute modifications locales

À la fin de celui-ci plutôt fastidieux processus, vous aurez un seul ou plusieurs fichiers cachés.

95voto

blueyed Points 7719

Lorsque (ou avec ) serait trop lourd, je l’ai trouvé plus facile à utiliser , et :

Pour « planquer » un fichier/dir particulier uniquement :

Puis par la suite

23voto

JesusFreke Points 7447

Je trouve souvent qu'il est plus intuitif de faire l'inverse de @bukzor de l'approche. C'est, à ce stade des changements, et puis les ranger seuls ceux mis en scène changements.

Malheureusement, git n'offre pas un git stash --only-index ou similaire, voici donc un script qui semble fonctionner. Avertissement: je ne l'ai pas utilisé largement encore, de sorte qu'il peut toujours y avoir des problèmes tapie :)

#!/bin/sh

# first, go to the root of the git repo
cd `git rev-parse --show-toplevel`

# write out a tree with only the stuff in staging
INDEXTREE=`git write-tree`

# now write out a tree with everything
git add -A
ALL=`git write-tree`

# get back to a clean state with no changes, staged or otherwise
git reset -q --hard
git clean -fd

# apply the changes that were originally staged
git diff-tree -p HEAD $INDEXTREE | git apply --index

# stash the changes that were staged
git stash

# re-apply the changes that were originally unstaged
git diff-tree -p $INDEXTREE $ALL | git apply --reject

# Any conflicts will be saved as .rej files

Vous pouvez enregistrer le script ci-dessus en tant que git-stash-index quelque part sur votre chemin, et peut ensuite invoquer celle-ci comme git stash-index

# <hack hack hack>
git add <files that you want to stash>
git stash-index

Maintenant, le coffre contient une nouvelle entrée qui ne contient que les modifications que vous avais mis en scène, et votre arbre de travail contient encore toute unstaged changements

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