Comment est-ce que je peux planquer qu’une des multiples fichiers modifiés sur ma branche ?
Réponses
Trop de publicités?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:
rebase -i <last good commit>
- Marque quelques modifications comme l'
edit
. git reset HEAD^
git add <files you want to keep in this change>
git stash --keep-index
- Fixer des choses comme nécessaire. N'oubliez pas d'
git add
tous les changements. git commit
git stash pop
- De répétition, #5, en tant que de besoin.
git rebase --continue
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é surgit 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.
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