Supposons que la branche actuelle soit MyFeatureX. Et la branche locale develop
est à jour avec Origin. Les deux déclarations ci-dessous seraient-elles équivalentes? Quelle est la syntaxe recommandée?
git rebase Origin/develop
git rebase develop
Remarque: ce n'est pas la même question que git rebase Origin vs.git rebase Origin/master
Votre succursale locale develop
pistesOrigin/develop
et ils peuvent ne pas toujours avoir les mêmes commits.
$ cat ~/.git/config
[remote "Origin"]
url = [email protected]/repo.git
fetch = +refs/heads/*:refs/remotes/Origin/*
Cela signifie que nous avons un "distant" (un référentiel vivant ailleurs) nommé arbitrairement "Origin".
Votre branche locale develop
suit la branche à partir de ce référentiel distant, et il existe une référence locale à ces données appelée Origin/develop
. Pour la plupart, nous considérons que ces deux choses contiennent toujours les mêmes commits. Cependant, vous devez mettre à jour explicitement votre branche locale develop
pour obtenir les dernières données d'Origin. Cela se fait généralement avec un pull:
$ git status
on branch develop
$ git pull
...pulls latest changes from Origin
Cependant, un git pull
fait en fait deux étapes, un fetch
et un merge
. La première étape qu'il fait sous le capot est de récupérer toutes les dernières validations d'Origin, ce que vous pouvez faire avec
git fetch Origin
Cela mettra à jour la branche Origin/develop
, mais pas votre branche locale develop
.
Les derniers commits sont cachés "en arrière-plan" dans votre répertoire local .git, que vous pouvez référencer à partir de la branche nommée "Origin/develop".
Après une extraction, pour réellement créer votre branche locale Origin
, vous devez faire git merge Origin/develop
. Techniquement, ce n'est pas une fusion, ce sera une "avance rapide", ce qui signifie que git est assez intelligent pour faire correspondre votre branche locale Origin
Origin/develop
sans fusionner quoi que ce soit. Pour cette raison et d'autres, les fusions me font flipper.
Donc, si vous rebasez hors de develop
, il y a une chance que ce soit obsolète (plus ancien) que Origin/develop
.
Personnellement, je fais ce workflow avant de rebaser:
git fetch --all
git rebase Origin/branchname
Cela signifie que je peux extraire toutes les données sans avoir à trop penser à quelle branche je suis et rebaser le dernier code du référentiel distant. Plus tard, sur la branche develop
, un simple git pull
s'assurera que vous êtes à jour.
Si develop
pointe vers le même commit que Origin/develop
alors les deux commandes sont exactement les mêmes. J'aurais tendance à utiliser Origin/develop
au cas où j'aurais oublié de mettre à jour mon develop
local (en supposant que cette branche sera finalement poussée vers Origin/develop
).
Comme je l'ai écrit dans mon autre (longue) réponse à votre question précédente Pourquoi "rebase - sur ABC" est différent de "rebase ABC"? , ces deux commandes désactivent --fork-point
, donc, à condition que develop
et Origin/develop
se résolvent dans le même hachage de validation, comme ils le font dans votre prémisse de question - les deux commandes feront la même chose.
L'omission de l'argument <upstream>
Active --fork-point
Par défaut, et le reflog pour la branche configurée en amont peut contenir beaucoup de données. Dans ce cas, ils peuvent agir très différemment. En ajoutant un --no-fork-point
Explicite, vous pouvez empêcher git merge-base --fork-point
De supprimer les commits supprimés en amont.