Sujet Solution
La commande correcte pour répondre à la question posée peut être l'une des suivantes (en supposant que la branche topic
est déjà extraite):
git rebase --onto B master
git rebase --onto master~1 master
git rebase --onto B A
git rebase --onto B C
git rebase --onto B
Si topic
n'est pas extrait, vous ajoutez simplement topic
à la commande (sauf la dernière) comme suit:
git rebase --onto B master topic
Sinon, vérifiez d'abord la branche avec:
git checkout topic
Rebase toute chaîne de validations vers une validation cible
La forme de base de la commande dont nous avons besoin, tirée de la documentation, est:
git rebase --onto <Target> [<Upstream> [<Branch>]]
<Branch>
est facultatif et il ne fait que vérifier la branche spécifiée avant d'exécuter le reste de la commande. Si vous avez déjà extrait la branche que vous souhaitez rebase, vous n'en avez pas besoin. Notez que vous devez avoir spécifié <Upstream>
pour spécifier <Branch>
ou git pensera que vous spécifiez <Upstream>
.
<Target>
est le commit auquel nous attacherons notre chaîne de commits. Lorsque vous fournissez un nom de branche, vous spécifiez simplement le commit principal de cette branche. <Target>
peut être n'importe quel commit qui ne sera pas contenu dans la chaîne de commits déplacés. Par exemple:
A --- B --- C --- D master
\
\-- X --- Y --- Z feature
Pour déplacer l'ensemble de la branche de fonction, vous ne pouvez pas sélectionner X
, Y
, Z
ou feature
comme <Target>
puisque ce sont tous les commits à l' intérieur du groupe déplacé.
<Upstream>
est spécial car cela peut signifier deux choses différentes. S'il s'agit d'un commit qui est un ancêtre de la branche extraite, alors il sert de point de coupure. Dans l'exemple que j'ai fourni, ce serait tout ce qui est pas C
, D
ou master
. Tous les commits après<Upstream>
jusqu'à ce que la tête de la branche extraite soient ceux qui seront déplacés.
Cependant, si <Upstream>
n'est pas un ancêtre, alors git sauvegarde la chaîne à partir du commit spécifié jusqu'à ce que if trouve un ancêtre commun avec la branche extraite (et abandonne s'il n'en trouve pas). Dans notre cas, un <Upstream>
de B
, C
, D
ou master
generera COMMIT B
servant de point de coupe. <Upstream>
est elle-même une commande facultative et si elle n'est pas spécifiée, alors git regarde le parent de la branche extraite, ce qui équivaut à entrermaster
.
Maintenant que git a sélectionné les commits qu'il va couper et déplacer, il les applique dans l'ordre <Target>
, en ignorant ceux qui sont déjà appliqués à la cible.
Exemples et résultats intéressants
En utilisant ce point de départ:
A --- B --- C --- D --- E master
\
\-- X --- Y --- Z feature
git rebase --onto D A feature
Appliquera commits B
, C
, X
, Y
, Z
de commettre D
et finissent par sauter B
et C
parce qu'ils ont déjà été appliquées.
git rebase --onto C X feature
Appliquera les commits Y
et Z
s'engagera C
, supprimant effectivement le commitX
git checkout B
avant de courirgit rebase
?