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.
3 Réponses :
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
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 ...
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; - )
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 >