J'ai apporté quelques modifications à ma branche et j'ai réalisé que j'avais oublié que j'avais stocké d'autres modifications nécessaires dans ladite branche. Ce que je veux, c'est un moyen de fusionner mes modifications stockées avec les modifications actuelles.
Y a-t-il un moyen de faire cela?
C’est plus pratique, j’ai finalement abandonné et engagé d’abord mes modifications actuelles, puis mes modifications cachées, mais j’aurais préféré les intégrer d’un seul coup.
Je viens de découvrir que si vos modifications non validées sont ajoutées à l'index (c.-à-d. "Staged", en utilisant git add ...
), alors git stash apply
(et vraisemblablement git stash pop
) effectuera une fusion correcte. . S'il n'y a pas de conflits, vous êtes en or. Sinon, résolvez-les comme d'habitude avec git mergetool
, ou manuellement avec un éditeur.
Pour être clair, voici 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 cherchez.
Exécutez git add
en premier.
Lancer git stash pop
ou git stash apply
est essentiellement une fusion. Vous ne devriez pas avoir besoin de valider vos modifications actuelles à moins que les fichiers modifiés dans la stash le soient également dans la copie de travail. Dans ce 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 réserve à vos modifications actuelles en une seule étape. Vous pouvez valider les modifications, appliquer la cachette, commettre à nouveau et écraser ces deux commits en utilisant git rebase
si vous ne voulez vraiment pas deux commits, mais cela peut être plus gênant que cela en vaut la peine.
Ce que je veux, c'est un moyen de fusionner mes modifications stockées avec les modifications actuelles.
Voici une autre option pour le faire:
git stash show -p|git apply
git stash drop
git stash show -p
affichera le patch de la dernière sauvegarde stockée. git apply
l'appliquera. Une fois la fusion effectuée, le stash fusionné peut être supprimé avec git stash drop
.
Peut-être, ce n’est pas la pire idée de fusionner (via difftool) à partir de ... oui ... une branche!
> current_branch=$(git status | head -n1 | cut -d' ' -f3)
> stash_branch="$current_branch-stash-$(date +%yy%mm%dd-%Hh%M)"
> git stash branch $stash_branch
> git checkout $current_branch
> git difftool $stash_branch
La façon dont je le fais est de git add
ce premier puis git stash apply <stash code>
. C'est le moyen le plus simple.
Comme suggéré par @Brandan, voici ce que je devais faire pour me déplacer
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 il ne vous restera plus que des modifications complètement fusionnées locales en file
, prêtes à effectuer un travail/nettoyage ultérieur ou à effectuer un seul bon commit. Ou, si vous savez que le contenu fusionné de file
sera correct, vous pourrez écrire un message approprié et ignorer git reset HEAD^
.