Jusqu'à présent, la partie la plus déroutante de git rebase sur une autre branche. Plus précisément, ce sont les arguments de ligne de commande qui prêtent à confusion.
Chaque fois que je veux rebaser un petit morceau d'une branche sur la pointe d'une autre, je dois revoir la documentation de git rebase et cela me prend environ 5-10 minutes pour comprendre ce que chacun des 3 principaux arguments devrait être.
git rebase <upstream> <branch> --onto <newbase>
Quelle est la bonne règle de base pour m'aider à mémoriser à quoi chacun de ces 3 paramètres doit être réglé, compte tenu de tout type de rebase sur une autre branche?
Gardez à l'esprit que j'ai parcouru la documentation de git-rebase encore et encore, encore et encore et encore (et encore), mais c'est toujours difficile à comprendre (comme un livre blanc scientifique ennuyeux ou quelque chose). Donc, à ce stade, je sens que je dois impliquer d'autres personnes pour m'aider à le comprendre.
Mon objectif est de ne jamais avoir à consulter la documentation de ces paramètres de base. Je n'ai pas pu les mémoriser jusqu'à présent, et j'ai déjà fait une tonne de rebases. Il est donc un peu inhabituel que j'ai pu mémoriser toutes les autres commandes et ses paramètres jusqu'à présent, mais pas rebaser avec --onto
.
Réponses:
Sautons
--onto
pour le moment.upstream
etbranch
sont assez basiques, et en fait une sorte de mimiquecheckout
etbranch
- le deuxième argument est facultatif:( 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: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:Un
git merge master
résultat en ceci:Alors qu'un
git rebase master
(sur une branchefeature
!) Entraîne ceci:Dans les deux cas,
feature
contient maintenant le code des deuxmaster
etfeature
. Si vous n'êtes pasfeature
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:(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ésfeature
.)Pour voir pourquoi
--onto
est utile, voici un exemple différent. Disons que j'étaisfeature
allumé et que j'ai remarqué un bogue, que j'ai ensuite commencé à corriger - mais que j'avais dérivé aufeature
lieu demaster
par erreur:Ce que je veux, c'est "déplacer" ces commits pour
bugfix
qu'ils ne soient plus dépendantsfeature
. En l'état, toute sorte de fusion ou de rebase illustrée ci-dessus dans cette réponse prendra les troisfeature
validations avec les deuxbugfix
validations.Par exemple,
git rebase master bugfix
c'est faux. La plage<start>
à<end>
inclure tous les commitsfeature
, qui sont rejoués en plus demaster
:Ce que nous voulons réellement est la gamme de commits de
feature
àbugfix
être rejoué au - dessus demaster
. 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
la source
Juste un rappel, le rebasage est principalement pour quand vous voulez que votre historique de commit apparaisse linéaire si deux branches se sont développées indépendamment l'une de l'autre, fondamentalement il réécrit l'historique de commit.
la façon dont j'aime le faire est
git rebase --onto <target branch> <start branch> <end branch>
où
<target branch>
est la branche sur laquelle vous rebasez,<start branch>
est normalement la branche à partir de laquelle vous vous séparez<end branch>
et<end branch>
est la branche sur laquelle vous rebasez.si vous commencez par
et fait
tu auras
une autre bonne chose à savoir est que par
<target branch>
défaut<start branch>
, vous pouvez faire la même rebase quesi vous avez besoin de plus d'aide, consultez le guide Rebase without tears
la source
master
branche elle-même inchangée. Vous obtenez simplement une «fonctionnalité» pour vous ramifier commeG--C'--D'--E'
si vous vous arrêtiezmaster
toujours àG
.<target branch>
et<start branch>
sont différents afin d'aider les lecteurs à comprendre le cas le plus général?