2
votes

Rebase une branche à l'envers vers la branche principale?

J'ai une branche de fonctionnalité B qui est constituée d'une branche de fonctionnalité A. Je veux rebaser la branche B sur le maître sans les commits de la branche A.

Mon référentiel ressemble à ceci:

             c7---c8---c9 B
            /
c1---c2---c3  master
            \
             c4---c5---c6  A

Ce que je veux, c'est ceci:

c1---c2---c3  master
            \
             c4---c5---c6  A
                        \
                        c7---c8---c9  B

J'ai essayé de faire un rebase de la branche B vers le maître. Cela n'a rien fait et a gardé la branche B sur la branche A.


0 commentaires

3 Réponses :


6
votes

Il est possible de remonter de B à master , donc en ce qui concerne Git, la branche B est déjà "on" maître . En d'autres termes, B "contient" master .

Essayez d'être explicite sur la branche à rebaser et sur l'amont:

git rebase --onto master A B


1 commentaires

rebase change le hash de mon cerveau: -s Chaque fois que je pense avoir enfin l'essentiel, je tombe sur un autre mode qui me déroute. Je suppose que je viens de lire un peu plus < / a> à faire maintenant ...



4
votes

Une solution de sélection en 3 lignes, moins concise que l'excellente réponse de Chris mais peut-être plus claire pour certains, pourrait ressembler à ceci:

             c7'---c8'---c9'  <<< B <<< HEAD
            /
c1---c2---c3  <<< master
            \
             c4---c5---c6  <<< A
                        \
                        c7---c8---c9  <<< backup-B

Explication des étapes :

1) faire une sauvegarde (servant également de référence pour une sélection ultérieure)

git cherry-pick A..backup-B

c1---c2---c3  <<< master, B <<< HEAD
            \
             c4---c5---c6  <<< A
                        \
                        c7---c8---c9  <<< backup-B

2) pointez B au maître (et vérifiez-le dans le même temps)

git checkout -B B master

XXX

3) "copier" les commits manquants (NON accessible depuis A mais accessible depuis "l'ancien" B, ici c7 , c8 , c9)

c1---c2---c3  <<< master
            \
             c4---c5---c6  <<< A
                        \
                        c7---c8---c9  <<< backup-B, B <<< HEAD

git branch backup-B B

(bien sûr à ce point, bien que ce ne soit pas nécessaire, vous pouvez simplement supprimer la sauvegarde avec git branch -D backup-B pour obtenir le résultat exact que vous avez demandé. Cependant, un tel gilet de sauvetage est un léger fardeau pour le gititanic; - )


0 commentaires

2
votes

En plus de la solution proposée, en voici une troisième.

Vous pouvez exécuter un rebase interactif. Une fois extrait sur B , exécutez git rebase --interactive master . Votre $ EDITOR sera ouvert avec ce qui suit:

pick c7 Message of c7
pick c8 Message of c8
pick c9 Message of c9

Ici, il vous suffit alors de supprimer les commits appartenant à A code >, vous devez donc faire ressembler le fichier à:

pick c4 Message of c4
pick c5 Message of c5
pick c6 Message of c6
pick c7 Message of c7
pick c8 Message of c8
pick c9 Message of c9

Ensuite, enregistrez et quittez, et voila .

p >


0 commentaires