224 votes

git stash -> fusionner les changements stockés avec les changements actuels

J'ai apporté des modifications à ma branche et j'ai réalisé que j'avais oublié que j'avais caché d'autres modifications nécessaires à ladite branche. Ce que je veux, c'est un moyen de fusionner mes modifications cachées avec les modifications actuelles.

Y a-t-il un moyen de le faire ?

C'est plus pour des raisons de commodité, j'ai fini par abandonner et engager d'abord mes changements actuels, puis mes changements cachés, mais j'aurais préféré les obtenir d'un seul coup.

344voto

Luke H Points 171

en résumé

Exécuter git add d'abord.


Je viens de découvrir que si vos modifications non validées sont ajoutées à l'index (c.-à-d. "mises en scène", en utilisant la fonction git add ... ), alors git stash apply (et, vraisemblablement, git stash pop ) va réellement faire une fusion correcte. S'il n'y a pas de conflits, c'est parfait. Sinon, résolvez-les comme d'habitude avec git mergetool ou manuellement avec un éditeur.

Pour être clair, c'est le processus dont je parle :

mkdir test-repo && cd test-repo && git init
echo test > test.txt
git add test.txt && git commit -m "Initial version"

# here's the interesting part:

# make a local change and stash it:
echo test2 > test.txt
git stash

# make a different local change:
echo test3 > test.txt

# try to apply the previous changes:
git stash apply
# git complains "Cannot apply to a dirty working tree, please stage your changes"

# add "test3" changes to the index, then re-try the stash:
git add test.txt
git stash apply
# git says: "Auto-merging test.txt"
# git says: "CONFLICT (content): Merge conflict in test.txt"

... ce qui est probablement ce que vous recherchez.

74voto

Brandan Points 8311

Running git stash pop o git stash apply est essentiellement une fusion. Vous n'auriez pas dû avoir besoin de livrer vos modifications actuelles, à moins que les fichiers modifiés dans la cachette soient également modifiés dans la copie de travail, auquel cas vous auriez vu ce message d'erreur :

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

Dans ce cas, vous ne pouvez pas appliquer la cachette à vos changements actuels en une seule étape. Vous pouvez commiter les changements, appliquer la cache, commiter à nouveau et écraser ces deux commits à l'aide de la commande git rebase si vous ne voulez vraiment pas deux engagements, mais ça peut être plus de problèmes que ça n'en vaut la peine.

29voto

ks1322 Points 9238

Ce que je veux, c'est un moyen de fusionner mes modifications cachées avec la version actuelle de la base de données. modifications

Voici une autre option pour le faire :

git stash show -p|git apply
git stash drop

git stash show -p montrera le patch de la dernière cachette sauvegardée. git apply l'appliquera. Après que la fusion soit faite, la cachette fusionnée peut être déposée avec git stash drop .

2voto

user3856437 Points 388

La façon dont je fais cela est de git add ceci d'abord puis git stash apply <stash code> . C'est le moyen le plus simple.

0voto

knickum Points 521

Comme suggéré par @Brandan, voici ce que j'ai dû faire pour m'en sortir

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

Suivez ce processus :

git status  # local changes to `file`
git stash list  # further changes to `file` we want to merge
git commit -m "WIP" file
git stash pop
git commit -m "WIP2" file
git rebase -i HEAD^^  # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^
# mark the second commit to squash into the first using your EDITOR
git reset HEAD^

Et vous vous retrouverez avec une fusion complète local les changements apportés à file prêt à faire d'autres travaux/nettoyages ou à faire un seul bon engagement. Ou, si vous connaissez le contenu fusionné de file sera correcte, vous pourriez écrire un message d'ajustement et sauter git reset HEAD^ .

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