Mon scénario est que j'ai une branche dans laquelle j'ai apporté de grandes améliorations au processus de construction (branche A) et dans une autre, je travaille sur une fonctionnalité non liée (branche B). Alors maintenant, quand je pirate la branche B, je veux tirer les trucs que j'ai écrits dans la branche A parce que je veux des builds plus rapides et plus faciles. Cependant, je ne veux pas "polluer" ma branche B, il suffit d'ajouter des modifications de la brancheA aux modifications non mises en scène.
Ce que j'ai essayé (en se tenant sur la branche B):
git merge --no-commit branchA
Ne fonctionne pas car il vous place dans une fusion. Sinon, ce serait parfait.
git checkout branchA -- .
Ne fonctionne pas car il applique les modifications entre branchA..branchB et non les modifications master..branchA.
Rien d'autre?
Edit: Oui, les modifications sur la branche A sont validées. Dans cet exemple, il n'y a qu'une seule branche avec des améliorations de build, mais il peut y avoir jusqu'à N branches avec des améliorations de build que je souhaite appliquer tout en travaillant sur une branche de fonctionnalité.
Je devais juste faire quelque chose de similaire et j'ai pu le réparer en ajoutant --squash
à la commande de fusion
git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes
cherry-pick -n
devrait faire ce que vous voulez, mais je ne sais pas pourquoi vous voulez que les améliorations de la construction soient des modifications non mises en scène - cela rend simplement plusieurs choses plus difficiles (par exemple, fusionner d'autres modifications dans les fichiers modifiés ou rebaser quoi que ce soit).
Dans cet exemple, il n'y a qu'une seule branche avec des améliorations de build, mais il peut y avoir jusqu'à N branches avec des améliorations de build que je souhaite appliquer tout en travaillant sur une branche de fonctionnalité.
Dans ce cas, je créerais une nouvelle branche, C, que vous fusionneriez à la fois de A et B (et de toute autre branche avec des améliorations de construction). Validez les modifications sur la branche de fonctionnalité, B, puis fusionnez-les dans la branche C, qui contient désormais les améliorations de construction et les modifications de la branche de fonctionnalité, afin que vous puissiez les tester ensemble. Si vous avez besoin de faire plus de changements, faites-le dans la branche appropriée, pas C, puis fusionnez en C. Donc, ne changez jamais rien dans la branche C, utilisez-le simplement pour intégrer les changements des autres branches.
Cela signifie que vous pouvez utiliser toutes les fonctionnalités de Git dans la branche C, au lieu de jongler avec les modifications non validées dans un arbre sale.
Vous devriez pouvoir sélectionner les commits (avec -n
pour éviter de s'engager tout de suite).
Je ne suis pas sûr de comprendre vos exigences.
Vous pouvez exécuter une fusion, puis appeler git reset HEAD~1
.
La séquence suivante doit rejouer chaque commit entre master
et branchA
en haut de branchB
. Les validations déjà appliquées sur branchB
seront ignorées.
# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip
# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB
# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip
Je ne suis pas sûr à 100% de l'avoir bien compris, mais dans mon cas, je viens de créer un patch diff entre les branches, puis j'ai appliqué ce chemin sur la branche B.
À l'intérieur de la branche A:
git diff branchA..branchB > patch.diff
git apply patch.diff