Rebaser une branche de fonctionnalité sur une autre branche de fonctionnalité

305

J'ai deux branches de fonctionnalités (privées) sur lesquelles je travaille.

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

Après avoir travaillé sur ces branches un peu de temps, j'ai découvert que j'avais besoin des modifications de Branch2 dans Branch1. Je voudrais rebaser les changements dans Branch2 sur Branch1. Je voudrais terminer avec ce qui suit:

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

Je suis sûr que je dois rebaser la deuxième branche sur la première, mais je ne suis pas entièrement sûr de la syntaxe correcte et de la branche que j'aurais dû vérifier.

Cette commande produira-t-elle le résultat souhaité?

(Branch1)$ git rebase --onto Branch1 Branch2
Arjen
la source
11
Pour répondre à votre question, je voudrais créer un référentiel de test, créer la structure de validation que vous avez montrée et essayer la commande que vous avez montrée. Mais je pense que vous pouvez le faire vous-même, donc je ne vais pas le faire :)
Daniel Hilgarth
3
Merci. J'étais tellement déterminé à bien faire les choses la première fois que cela ne m'est pas venu à l'esprit que je pouvais facilement le tester moi-même :-)
Arjen
4
C'est ce que je pensais, c'est pourquoi j'ai posté ce commentaire :) Chaque fois que je fais quelque chose, je ne suis pas sûr qu'il fera ce que je pense qu'il fait, je crée un référentiel de tests et j'y fais mes tests. Ou bien, je crée une copie de mon vrai référentiel et effectue les tests sur la copie.
Daniel Hilgarth
Note: Git 2.0 introduira un raccourci pour ce genre de rebasage: git rebase -. voir ma réponse ci
VonC
5
Note mineure: Les réponses donnent le résultat de branch2. L'OP voulait une branche1. Ou j'ai raté quelque chose?
Josef.B

Réponses:

353
  1. Passer à Branch2

    git checkout Branch2
    
  2. Appliquez les modifications actuelles (Branche2) en plus des modifications de Branche1, en restant dans la Branche2:

    git rebase Branch1
    

Ce qui vous laisserait le résultat souhaité dans Branch2:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

Vous pouvez supprimer Branch1.

sasikt
la source
Merci! Lors de la suppression de la branche après le rebasage, je reçois un message indiquant que la branche n'est pas complètement fusionnée. Je suppose que je peux ignorer ce message en toute sécurité et forcer la suppression?
Arjen
10
ne voulait-il pas avoir tous les changements dans Branch1?
tomasz_kusmierczyk
6
Cela semble être l'opposé de ce qu'il voulait, non?
1252748
1
En effet, @tomasz_kusmierczyk et @ 1252748, et moi aussi je me suis confondu. Mais j'ai réalisé que jouer git rebasependant que je restais dans Branch1 réécrirait l'historique de Branch1 pour que les changements de Branch1 s'ajoutent à ceux copiés depuis Branch2. Cela se traduira par l'ordre de commettre ce qui suit, a - b - f - g - c' - d' - e'.
anguille ghEEz
1
@tomasz_kusmierczyk et 1252748, ce n'est pas le contraire de ce qu'il veut, c'est EXACTEMENT ce qu'il voulait. Peu importe le nom des succursales, vous pouvez toujours les changer.
a3y3
56

Remarque: si vous étiez allumé Branch1, vous pourrez avec Git 2.0 (Q2 2014) taper:

git checkout Branch2
git rebase -

Voir commit 4f40740 par Brian Gesiakmodocache :

rebase: autorise " -" le raccourci pour la branche précédente

Teach rebasage le même raccourci que checkoutet mergede nommer la branche à rebasela branche actuelle sur; c'est-à-dire que " -" signifie "la branche où nous étions auparavant".

VonC
la source
26
sympa, mais aussi un peu dangereux. parfois la verbosité l'emporte. mais là encore, j'aime aussi Java ... (-:
sthzg
3

Je sais que vous avez demandé de rebaser, mais je choisirais à la place les commits que je voulais faire passer de Branch2 à Branch1. De cette façon, je n'aurais pas besoin de me soucier de la date de création de la branche à partir de master, et j'aurais plus de contrôle sur la fusion.

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
Craigo
la source