La règle avec Git est que vous ne devriez jamais essayer de modifier l'historique après qu'il ait été partagé, publié ou poussé. Vous pouvez le faire, bien sûr, si vous le voulez vraiment et si vous avez les permissions suffisantes, mais cela doit être fait avec beaucoup de précaution car cela peut perturber d'autres personnes.
Heureusement, lorsque vous avez un déploiement Git typique avec un seul dépôt amont (origine) qui est la source de tout ce qui est bon et vrai dans l'univers, vous pouvez utiliser git pull --rebase
à votre guise, ce sera parfaitement sûr et, à mon avis, cela vous donnera une histoire beaucoup plus saine (c'est-à-dire linéaire). Mon équipe et moi-même l'utilisons en permanence.
Cependant, si vous commencez à avoir plusieurs télécommandes et à faire git pull --rebase <arguments>
afin que vous ne fassiez plus de rebasement sur la même cible à chaque fois, ou commencez à pousser votre branche vers des dépôts alternatifs. avant en cours d'exécution git pull --rebase
avec votre primaire en amont - alors vous pouvez commencer à avoir des problèmes.
Chaque fois que vous partagez vos modifications avec un autre dépôt distant et que vous modifiez ensuite ces modifications (pour des valeurs de modification égales à la modification du SHA, du parent, etc. même si le message/contenu du commit n'a pas changé), vous pouvez perturber la personne qui avait les anciennes modifications.
Tant que vous ne sortez pas de l'enveloppe de bon sens de la base, git pull --rebase
sera très bon pour vous.
Cela, err, ne répond pas à la question sur la différence entre git pull --rebase
y git fetch && git rebase @{u}
. Je me contenterai de dire que je n'ai pas conscience d'une quelconque différence et que, s'il y en a une, elle est suffisamment subtile pour que je ne la remarque pas depuis que j'utilise Git. Peut-être dans le fait que le système détermine le dépôt correct que votre branche doit récupérer si vous avez plusieurs dépôts et que "origin" n'est pas l'amont de cette branche ?
Et même si vous vous trompez avec git-rebase, vous pouvez bien sûr revenir à votre environnement original pré-rebase facilement avec git log -g
et/ou git reset --hard ORIG_HEAD
. Évitez simplement de faire des poussées forcées (interdites par défaut dans presque tous les serveurs Git), et vous serez heureux.
EDITED
Avec le temps, ma compréhension s'est élargie. git pull --rebase
appelle git rebase
pour faire le travail de rebasement, donc dans ce sens il n'y a pas de différence entre eux. Cependant, git-pull appelle en fait git rebase --onto @{u} $(git merge-base HEAD @{u}@{1})
D'accord, cette syntaxe ("@{u}@{1}") est peut-être un peu opaque et est en plus une simplification, mais le fait est qu'elle permet de savoir quelle était la base de fusion en amont. AVANT il a lancé la commande fetch. Quelle différence cela fait-il, demandez-vous ?
Eh bien, dans le cas normal, aucune. Cependant, si vous changez l'endroit vers lequel upstream pointe ou si upstream lui-même a été rebasé, pas mal de choses. Si upstream a été réécrit et que vous avez ensuite fait un git rebase @{u}
vous pourriez être très malheureux et obtenir des doubles-commits ou des conflits selon le degré de réécriture des anciens commits.
Cependant, avec la magie derrière git pull --rebase
seuls les commits qui sont les vôtres et uniquement les vôtres seront appliqués au-dessus de @{u}.
OK, ceci trop est une simplification. Si upstream fait un rebasement en commençant par les 100 commits précédents (mais il y a en fait 101+ commits dans l'historique) y vous avez fait un git fetch
avant faire un git pull --rebase
alors Git ne sera pas en mesure de déterminer avec précision quelle était la base de fusion historique appropriée pour déterminer quels sont vos commits locaux.
Le résultat est le suivant , git fetch
est considéré comme nuisible (lorsque vous avez des commits locaux et que l'amont est réécrit). Cependant, la véritable règle d'or est de "ne jamais tenter de modifier l'histoire après qu'elle ait été partagée, publiée ou poussée", et c'est là que j'ai commencé.
TL;DR :
git fetch
est considéré comme nuisible (utilisez donc git pull --rebase
) ; et n'essayez jamais de modifier l'historique après qu'il ait été partagé, publié ou poussé (parce que, entre autres, cela entraînerait git fetch
pour être nuisible).
1 votes
Un très bon livre sur git que vous devriez garder sous votre oreiller. progit.org
0 votes
L'avertissement sur le
git pull
donne l'impression que les choses peuvent déraper assez facilement. Mais la description dans le livre donne l'impression qu'il faut faire un effort pour foirer le rebasage.0 votes
Ce que j'ai fini par faire régulièrement est d'utiliser
git fetch
pour mettre à jour ma vue du dépôt distant, puis en regardant l'historique tiré vers le bas et en décidant ce que je veux faire. (En général, je fais suivre cette opération d'ungit rebase
.)0 votes
Question similaire stackoverflow.com/questions/18930527/