web-dev-qa-db-fra.com

Comment combiner plusieurs stashes dans git

Il s'agit d'un pipeline sur la branche frontend au cours des deux dernières semaines.

| Stash@{3} est tout le code depuis Stash@{1} (à l'exception des deux minuscules commits)
| Tiny Commit
| Petit engagement
| Il y a deux semaines, un énorme volume d'engagement a été rebasé et déplacé vers Stash@{1}

Mon arbre de travail est actuellement propre.
Stash@{1} est le contenu d'une validation groupée de code de développement général il y a deux semaines (cela aurait dû être caché en premier lieu). Ce commit a été annulé et déplacé vers la cachette.
Stash@{3} est le plus récent travail sur cet arbre depuis Stash@{1} (moins quelques modifications qui ont été validées).

Je dois combiner ces deux stashes ensemble dans mon arbre de travail afin que je puisse faire un certain nombre de validations à partir de cet énorme pool de travail.

J'ai couru git stash apply stash@{1} alors j'ai essayé:

git stash apply stash@{3}
git stash show -p | git stash apply stash@{3}

mais je reçois "arbre de travail sale" dans les deux cas. Comment puis-je fusionner ce travail ensemble? Car stash@{3} est plus récent, je veux qu'il remplace stash@{1} partout où il y a des conflits.

56
sscirrus

Vous ne pouvez appliquer une stash que s'il n'y a pas de conflits avec des fichiers modifiés dans l'arborescence de travail, donc, tout d'abord, assurez-vous qu'il n'y a pas de fichiers modifiés dans git status, le cas échéant, validez-les. Alors fais:

git stash apply stash@{1}
git commit -a
# Enter your commit message
git stash apply stash@{3}

Ensuite, vous pouvez soit faire un nouveau commit, soit modifier le précédent pour les combiner. Vous devrez peut-être résoudre les conflits de fusion après chaque application.

De plus, si vous décidez d'utiliser git stash pop plutôt que apply, notez que stash@{3} deviendrait stash@{2} depuis que le premier a été sauté.

43
Andrew Marshall

C'est un peu impliqué, mais cela fonctionne presque toujours:

  1. Faites éclater la première cachette

    $ git stash pop
    
  2. Validez temporairement les modifications depuis le premier stash

    $ git add . && git commit -am 'WIP'
    
  3. Pop la deuxième cachette

    $ git stash pop
    
  4. Annuler la validation temporaire, en conservant les modifications qu'elle a introduites

    $ git reset --soft HEAD^
    
96
bkeepers

Une meilleure façon consiste simplement à utiliser git stash show -p stash@{whatever} > stash-{whatever}.diff puis utilisez git apply pour chacun.

12
siride

J'ai eu un problème similaire et je l'ai résolu comme ça.

Utilisation git stash pop pour appliquer l'un des masques. Créez ensuite un patch de cette cachette avec git diff -p > ../stash.diff. Vous pouvez ensuite réinitialiser votre arborescence de travail (ou ranger à nouveau les modifications) et faire apparaître l'autre stash avec git stash pop stash@{1}. Si vous appliquez votre patch à ce moment, vous pouvez "fusionner" les deux cachettes différentes.

Vous aurez probablement des conflits à résoudre. Si tout se passe bien, vous pouvez alors supprimer les modifications cachées.

2
Henridv