Sautons --onto
pour le moment. upstream
et branch
sont assez basiques, et en fait une sorte de mimique checkout
et 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 branch
qui 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 rebase
produit 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 master
ré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, feature
contient maintenant le code des deux master
et feature
. Si vous n'êtes pas feature
activé, le deuxième argument peut être utilisé pour y basculer en tant que raccourci: git rebase master feature
fera 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 --onto
spécifiquement, cela se traduirait par la même chose:
git rebase --onto master master
git rebase --onto master master feature
(Je n'utilise pas --onto
sans 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 --onto
est utile, voici un exemple différent. Disons que j'étais feature
allumé et que j'ai remarqué un bogue, que j'ai ensuite commencé à corriger - mais que j'avais dérivé au feature
lieu de master
par erreur:
A--B--F--G master
\
C--D--E feature
\
H--I bugfix
Ce que je veux, c'est "déplacer" ces commits pour bugfix
qu'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 feature
validations avec les deux bugfix
validations.
Par exemple, git rebase master bugfix
c'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 --onto
sert - 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