888 votes

Quand dois-je utiliser git pull --rebase ?

Je connais des gens qui utilisent git pull --rebase par défaut et d'autres qui insistent pour ne jamais l'utiliser. Je crois que je comprends la différence entre fusion et rebasage, mais j'essaie de placer cela dans le contexte de git pull . S'agit-il simplement de ne pas vouloir voir un grand nombre de messages de validation de fusion, ou y a-t-il d'autres problèmes ?

2 votes

Source pour les personnes déconseillant git tirer -rebase ? Rebase ou git rebase est séparé activité de git tirer -rebase !

776voto

scode Points 2817

J'aimerais donner une perspective différente sur ce que signifie réellement "git pull --rebase", car il semble que cela soit parfois perdu.

Si vous avez déjà utilisé Subversion (ou CVS), vous êtes peut-être habitué au comportement de "svn update". Si vous avez des changements à livrer et que la livraison échoue parce que des changements ont été faits en amont, vous faites "svn update". Subversion procède en fusionnant les changements en amont avec les vôtres, ce qui peut entraîner des conflits.

Ce que Subversion vient de faire, était essentiellement "pull --rebase". L'acte de reformuler vos changements locaux pour qu'ils soient relatifs à la nouvelle version est la partie " rebasement ". Si vous avez fait "svn diff" avant la tentative de livraison ratée, et que vous comparez la différence résultante avec la sortie de "svn diff" après, la différence entre les deux différences est ce que l'opération de rebasement a fait.

La différence majeure entre Git et Subversion dans ce cas est que dans Subversion, "vos" modifications n'existent que sous forme de modifications non-committées dans votre copie de travail, alors que dans Git vous avez des commits réels localement. En d'autres termes, dans Git vous avez bifurqué l'historique ; votre historique et l'historique amont ont divergé, mais vous avez un ancêtre commun.

À mon avis, dans le cas normal où votre branche locale reflète simplement la branche amont et où vous effectuez un développement continu sur celle-ci, la bonne chose à faire est toujours "--rebase", car c'est ce que vous êtes sémantiquement en réalité. en faisant . Vous et d'autres s'attaquent à l'histoire linéaire prévue d'une branche. Le fait que quelqu'un d'autre ait poussé un peu avant votre tentative de poussée n'est pas pertinent, et il semble contre-productif que chaque accident de timing de ce type entraîne des fusions dans l'historique.

Si vous ressentez réellement le besoin que quelque chose soit une branche pour une raison quelconque, c'est une autre préoccupation à mon avis. Mais à moins que vous ayez un désir spécifique et actif de représenter vos changements sous la forme d'une fusion, le comportement par défaut devrait, à mon avis, être "git pull --rebase".

Veuillez tenir compte des autres personnes qui doivent observer et comprendre l'histoire de votre projet. Voulez-vous que l'histoire soit jonchée de centaines de fusions partout, ou voulez-vous seulement les quelques fusions qui représentent de véritables fusions d'efforts de développement intentionnellement divergents ?

20 votes

@MarceloCantos Pour être clair, je ne dis pas que git (l'outil) devrait être rebase par défaut. Ce serait dangereux car un rebase détruit essentiellement l'historique. Je dis qu'en termes de flux de travail, lorsque vous n'avez pas l'intention de faire une branche et que vous êtes juste en train de travailler sur une branche sur laquelle d'autres personnes travaillent également, "git pull --rebase" devrait être le comportement par défaut de l'utilisateur.

1 votes

Tu veux dire qu'on ne devrait pas git config --global branch.autosetupmerge always ?

9 votes

@MarceloCantos Non, je ne le suis pas ;) Personnellement, je laisserais autosetupmerge à la valeur par défaut de true (si je fusionne entre des branches autres que local<->remote, je préfère que ce soit explicite). Je dis simplement qu'en tant qu'humain, j'utilise toujours "git pull --rebase" dans le cadre de mon flux de travail normal "grab latest in master branch", parce que je ne veux jamais créer un commit de fusion à moins que je ne fasse explicitement une branche.

646voto

Pavel Shved Points 34706

Vous devez utiliser git pull --rebase quand

  • vos changements ne méritent pas une branche séparée

En effet, pourquoi pas ? C'est plus clair, et ça n'impose pas une regroupement logique sur vos commits.


Ok, je suppose que ça nécessite quelques clarifications. Dans Git, comme vous le savez probablement, vous êtes encouragés à faire des branches et des fusions. Votre branche locale, dans laquelle vous tirez les changements, et votre branche distante sont, en fait, des branches différentes, et git pull est de les fusionner. C'est raisonnable, car vous ne poussez pas très souvent et accumulez généralement un certain nombre de modifications avant qu'elles ne constituent une fonctionnalité achevée.

Cependant, parfois, quelle qu'en soit la raison, vous pensez qu'il serait préférable que ces deux éléments, distant et local, soient un branche. Comme dans SVN. C'est ici que git pull --rebase entre en jeu. On ne fusionne plus, on commettre sur la branche distante . C'est de cela qu'il s'agit en fait.

La question de savoir si c'est dangereux ou non est celle de savoir si vous traitez la branche locale et la branche distante comme une chose indissociable. Parfois c'est raisonnable (quand vos changements sont petits, ou si vous êtes au début d'un développement robuste, quand des changements importants sont apportés par de petits commits). Parfois, cela ne l'est pas (lorsque vous auriez normalement créé une autre branche, mais que vous êtes trop paresseux pour le faire). Mais c'est une autre question.

21 votes

Je pense que c'est utile lorsque vous travaillez sur la même branche, mais que vous pouvez changer de poste de travail. J'ai tendance à commiter et à pousser mes changements à partir d'un poste de travail, puis à tirer la base dans l'autre, et à continuer à travailler sur la même branche.

12 votes

C'est une bonne pratique de configurer Git pour qu'il rebase automatiquement lors d'un pull avec git config --global pull.rebase preserve (preserve dit en plus d'activer le rebasage, d'essayer de préserver les fusions si vous en avez fait localement).

2 votes

Je ne suis pas d'accord pour dire que vous devez utiliser pull --rebase uniquement lorsque vous travaillez sur une branche. Vous devriez l'utiliser tout le temps, sauf si cela est impossible en raison d'une autre circonstance.

160voto

krosenvold Points 35979

Je pense que vous devriez utiliser git pull --rebase lorsque vous collaborez avec d'autres personnes sur la même branche. Vous êtes dans votre cycle de travail commit work commit, et quand vous décidez de pousser votre travail, votre poussée est rejetée, car il y a eu un travail parallèle sur la même branche. À ce moment-là, je toujours faire un pull --rebase . Je n'utilise pas squash (pour aplanir les commits), mais je rebase pour éviter les commits de fusion supplémentaires.

Au fur et à mesure que votre connaissance de Git augmente, vous vous retrouvez à regarder beaucoup plus l'historique qu'avec les autres systèmes de contrôle de version que j'ai utilisés. Si vous avez une tonne de petits commits de fusion, il est facile de perdre de vue l'image globale qui se passe dans votre historique.

C'est en fait la seule fois où je fais du rebasement(*), et le reste de mon flux de travail est basé sur la fusion. Mais tant que vos committers les plus fréquents le font, l'histoire est bien meilleure à la fin.

(*) Alors que j'enseignais un cours sur Git, un étudiant m'a arrêté sur ce point, car je préconisais également le rebasage des branches de fonctionnalités dans certaines circonstances. Et il avait lu cette réponse ;) Un tel rebasage est également possible, mais il doit toujours se faire selon un système pré-établi/convenu, et en tant que tel ne devrait pas être appliqué "toujours". Et à ce moment-là, je ne fais généralement pas de pull --rebase soit, ce qui est l'objet de la question ;)

2 votes

On peut sûrement écrire un script pour cacher les merge commits du log.

3 votes

Les fusions peuvent également contenir des différences, ce qui signifie que ce n'est pas entièrement trivial.

9 votes

@hasen j Oui, mais le CONTENU de ces fusions peut avoir de l'importance.

55voto

Dustin Points 35205

Je ne pense pas qu'il y ait jamais de raison no à utiliser pull --rebase -- J'ai ajouté un code à Git spécifiquement pour permettre à mes git pull pour toujours rebaser sur les commits amont.

Lorsque l'on regarde l'histoire, il n'est jamais intéressant de savoir quand l'homme ou la femme qui travaillait sur le projet s'est arrêté pour se synchroniser. Cela peut être utile pour le gars/la fille pendant qu'il/elle le fait, mais c'est ce qu'il/elle fait. reflog est pour. C'est juste ajouter du bruit pour tous les autres.

2 votes

"Quand on regarde dans l'histoire, il n'est juste jamais intéressant de savoir quand le gars qui travaille sur la fonctionnalité s'est arrêté pour se synchroniser." / mais cela ne veut-il pas dire que ces commits intermédiaires sont probablement des builds cassés ?

11 votes

Oui, et ils ne sont pas non plus un "État entier". C'est pour ça qu'on n'en veut pas. Je veux savoir ce qu'il voulait, pas comment il y est arrivé.

5 votes

Si pull --rebase devrait toujours être utilisé, pourquoi ne pas pull le faire par défaut ?

9voto

hasenj Points 36139

Je pense que cela se résume à une préférence personnelle.

Voulez-vous cacher vos erreurs stupides avant de pousser vos changements ? Si c'est le cas, git pull --rebase est parfait. Il vous permet de réduire ultérieurement vos commits à quelques (ou un) commits. Si vous avez des fusions dans votre historique (non poussé), il n'est pas si facile de faire un git rebase plus tard.

Personnellement, cela ne me dérange pas de publier toutes mes erreurs stupides, c'est pourquoi j'ai tendance à fusionner plutôt qu'à rebaser.

8 votes

Note à l'attention de quiconque consulte cette question : cette réponse n'a absolument rien à voir avec la question "quand dois-je utiliser git pull --rebase ?".

3 votes

@therealklanni J'ai modifié la réponse pour qu'elle soit plus claire sur sa pertinence par rapport à la question (en espérant que cela ne détruise pas l'intention).

0 votes

Partager un journal de travail sale et non structuré n'est pas un effort honnête, c'est juste de la paresse. Vous faites perdre du temps aux gens en les obligeant à vous suivre dans votre terrier de développement et de débogage ; donnez-leur le résultat, pas les divagations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X