2015-02-28 1 views
1

enter image description hererebasage git en utilisant --onto

Ce qui précède est mon arbre et est le code ici, je l'ai utilisé pour le créer, mais je dirais que le code est insignifiant à ma question, mais juste au cas où vous souhaite l'essayer, c'est parti.

http://pastebin.com/gdy0cPb8

Actuellement, je suis vérifié sur master et Execute git rebase --onto <any commit> master. Ceci déplace le pointeur du maître sur <any commit>. Par exemple, git rebase --onto client master déplace le pointeur du maître sur C4 mais n'apporte aucune autre modification.

Je supposais que ce serait le comportement par défaut parce que le master est le [upstream] pour comparer et comme c'est la même branche, je comprends que master est juste déplacé là. [Reference git-scm.org]

Cependant, la même chose se produit même quand j'exécute git rebase --onto m2 master (sans premier maître passer à C4), le pointeur est déplacé à juste C9

Je voudrais juste savoir, pourquoi est-ce que cela se produise?

+0

ce que vous attendiez de se produire? –

+0

Je m'attends à ce que 'C8' soit appliqué par dessus' C9', je me rends compte qu'il y a d'autres façons de le faire mais je veux savoir pourquoi la commande mentionnée ne fait pas ça – Lordbalmon

Répondre

3

C'est ce qui se passe lorsque vous exécutez git rebase --onto m2 master:

  1. Git identifie tous les commits qui sont dans votre branche courante, mais pas dans <upstream>. Dans ce cas, votre amont est maître, identique à votre branche actuelle, il n'y a donc pas de commits différents. Git fait effectivement git reset --hard <newbase>. Newbase est le commit spécifié avec --onto, dans ce cas m2. Ceci déplace la branche principale vers m2.
  2. Git réapplique les validations trouvées à l'étape 1. Comme il n'y en a aucune dans ce cas, la rebase est terminée.La seule chose qui est arrivée dans ce processus est que votre branche principale a été déplacée vers C9.

    Il semble que ce que vous voulez faire est de déplacer la branche principale (y compris C8) sur C9. Pour ce faire, vous pouvez simplement vérifier le maître, puis exécutez git rebase m2. Permet de refaire le processus. Git trouve les commits en master mais pas en m2. Il y a un commit, C8. Git enregistre cela pour plus tard.

  3. Git fait git reset --hard <newbase>. Puisque nous n'avons pas spécifié --onto, la valeur par défaut est <upstream> qui est m2. Donc le maître se déplace au m2.
  4. Git réapplique les validations de l'étape 1. C8 sera réappliqué maintenant au-dessus de C9.

Vous vous retrouvez avec

... C7 - C9 - C8' master m2 

Avis écrit je C8' au lieu de C8. C'est parce que C8 va maintenant avoir un nouveau hachage de validation.

Pour les besoins du raisonnement, disons que vous vouliez le graphique suivant:

 C8' master 
    /
C4 - C5 - C6 - C7 - C9 m2 

Vous pouvez accomplir ceci en vérifiant maître et en cours d'exécution git rebase --onto C5 C7. Maintenant, cela se produit:

  1. Git trouve les validations dans le maître mais pas dans votre C7 amont. Il trouve C8.
  2. Git remet au <newbase>: git reset --hard C5
  3. Réappliquez engage à l'étape 1. (C8)
+0

Hi .. ça a du sens. Merci, pourriez-vous s'il vous plaît changer m9 en C9. – Lordbalmon

+0

Et dans votre dernier exemple, si je modifiais la commande de rebasage pour 'git rebase - sur C5 C5' ou' git rebase - sur C5 C6', j'obtiendrais le même résultat. Ai-je raison – Lordbalmon

+1

Non, tous les commits après votre amont serait rejoué sur C5. Donc, 'git rebase --onto C5 C6' se traduirait par' C4 - C5 - C6 - C7 '- C8'' en master. La branche m2 serait toujours 'C4 - C5 - C6 - C7 - C9'. Notez que C7 est maintenant dupliqué. Si vous avez spécifié C5 comme amont, vous devez également dupliquer la validation C6. –

1

git rebase --onto X Y fusionnerait les commits aprèsY jusqu'à la branche courante de tête sur X et déplacer la tête de la branche actuelle.

Si la branche actuelle est en fait Y, alors il n'y a pas commettras aprèsY de se déplacer. HEAD sera simplement déplacé à X.
Y

C'est ce qui se passe avec git rebase --onto m2 master

Que s'appliquerait en C8 à C9 serait:

git checkout master 
git rebase --onto m2 C7 

Ou, plus simple:

git checkout master 
git rebase m2 

Pas besoin de --onto ici: vous êtes rebasage la branche master au-dessus de m2. Cela s'appliquera C8 au-dessus de C9.