Sautons --ontopour le moment. upstreamet branchsont assez basiques, et en fait une sorte de mimique checkoutet branch- le deuxième argument est facultatif:
git branch <newbranch>
git branch <newbranch> <base>
git checkout -b <newbranch>
git checkout -b <newbranch> <base>
git rebase <upstream>
git rebase <upstream> <branch>
( En plus, les noms de ces arguments rebase, « en amont » et « branche » ne sont pas très descriptif OMI Je pense généralement d'entre eux comme peachoftree,. <start>Et <end>, ce qui est de savoir comment je vais les utiliser: git rebase <start> <end>)
Lorsque la deuxième branche est omise, le résultat est presque le même que la première extraction de cette branche, puis le fait comme si vous n'aviez pas spécifié cette branche. L'exception est celle branchqui ne change pas votre branche actuelle:
git checkout <base> && git branch <newbranch> && git checkout <previous_branch>
git checkout <base> && git checkout -b <newbranch>
git checkout <end> && git rebase <start>
En ce qui concerne la compréhension de ce qui se rebaseproduit lorsqu'il est invoqué, j'ai d'abord commencé par le considérer comme un type spécial de fusion. Ce n'est pas vraiment, mais cela a aidé lorsque j'ai commencé à comprendre le rebase. Pour emprunter l'exemple de peachoftree:
A--B--F--G master
\
C--D--E feature
Un git merge masterrésultat en ceci:
A--B--F-----G master
\ \
C--D--E--H feature
Alors qu'un git rebase master(sur une branche feature!) Entraîne ceci:
A--B--F--G master
\
C'--D'--E' feature
Dans les deux cas, featurecontient maintenant le code des deux masteret feature. Si vous n'êtes pas featureactivé, le deuxième argument peut être utilisé pour y basculer en tant que raccourci: git rebase master featurefera la même chose que ci-dessus.
Maintenant, pour la spéciale --onto. La partie importante à retenir avec cela est qu'elle est par défaut <start>si elle n'est pas spécifiée. Donc ci-dessus, si je spécifiais --ontospécifiquement, cela se traduirait par la même chose:
git rebase --onto master master
git rebase --onto master master feature
(Je n'utilise pas --ontosans spécifier <end>simplement parce qu'il est plus facile d'analyser mentalement, même si ces deux sont les mêmes s'ils sont déjà activés feature.)
Pour voir pourquoi --ontoest utile, voici un exemple différent. Disons que j'étais featureallumé et que j'ai remarqué un bogue, que j'ai ensuite commencé à corriger - mais que j'avais dérivé au featurelieu de masterpar erreur:
A--B--F--G master
\
C--D--E feature
\
H--I bugfix
Ce que je veux, c'est "déplacer" ces commits pour bugfixqu'ils ne soient plus dépendants feature. En l'état, toute sorte de fusion ou de rebase illustrée ci-dessus dans cette réponse prendra les trois featurevalidations avec les deux bugfixvalidations.
Par exemple, git rebase master bugfixc'est faux. La plage <start>à <end>inclure tous les commits feature, qui sont rejoués en plus de master:
A--B--F--G master
\ \
\ C'--D'--E'--H'--I' bugfix
\
C--D--E feature
Ce que nous voulons réellement est la gamme de commits de featureà bugfixêtre rejoué au - dessus de master. C'est à cela que --ontosert - en spécifiant une cible de "relecture" différente de la branche "start":
git rebase --onto master feature bugfix
A--B--F--G master
\ \
\ H'--I' bugfix
\
C--D--E feature