web-dev-qa-db-fra.com

Application des modifications de la branche b à a, sans fusion ni ajout de validations

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é.

63
Björn Lindqvist

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
108
guilffer

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.

9
Jonathan Wakely

Vous devriez pouvoir sélectionner les commits (avec -n pour éviter de s'engager tout de suite).

6
Lucero

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
4
LeGEC

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
1
sobi3ch