118 votes

Git pull génère des messages "Fusionner la branche" superflus dans le journal de validation

Je travaille avec un autre développeur sur un projet, et nous sommes à l'aide de Github comme notre repo distant. Je suis sur un Mac à l'aide de git 1.7.7.3, il est sur Windows à l'aide de git 1.7.6.

C'est ce qui se passe

  1. L'un de nous (appelons-le développeur, mais il n'est pas question que l'on pousse un ensemble de commits pour GitHub.
  2. Les autres (développeur B) fait quelques modifications locales.
  3. B un git pull.
  4. B un git push.
  5. À la recherche à la livraison du journal de l'historique, je vois de Fusion de la branche "master" de github.com:foo/bar

Le journal des modifications est obstrué avec une Fusion de la direction générale des messages au fil du temps, et montre aussi le développeur de B que de commettre les changements que développeur d'Un fait. Le seul moyen que nous avons trouvé pour éviter ce problème a été de faire un git pull --rebase à l'étape 3, mais je ne sais pas quels sont les effets secondaires de rebasage présentera. C'est ma première fois de travailler sur un multi-développeur repo git, alors est-ce juste un comportement normal? Toute réflexion sur la façon de résoudre ce problème?

94voto

poke Points 64398

Le commit que vous voyez est parfaitement bien. Un pull s'exécute efficacement git fetch puis git merge donc une opération de fusion est généralement qui se passe lorsque vous exécutez git pull.

L'alternative à l'utilisation de rebasage au lieu d'une fusion est possible, mais en général, vous devriez éviter. La relocalisation permet de garder une histoire linéaire, mais supprime également toutes les informations sur le branchement qui à l'origine s'est passé. Il entraînera aussi l'histoire de l'actuelle direction de la réécriture, de recréer tous les commits qui ne sont pas contenues dans la branche cible (dans votre cas, la télécommande). Comme l'a recréé les commits sont différentes s'engage, ce qui peut causer beaucoup de confusion lors de l'élaboration de concert avec les autres, surtout quand les gens déjà vérifié parties de celles-ci s'engage avant d'obtenir réécrit (par exemple avec des branches). Donc, en règle générale, vous devriez ne jamais réécrire le commit qui a déjà poussé.

Les commits que vous voyez sont là pour combiner les deux (ou plus) des branches. Il est parfaitement bien pour avoir un commit qui ne fait rien d'autre puis la fusion de plusieurs branches. En fait, il est très clair quand vous avez un commit de fusion qui combine les branches lorsque l'on regarde l'histoire. En comparaison à l'année de référence, la fusion aussi vous permet de voir l' origine de l'histoire, comme il a été développé, y compris la réelle branches qui coexistent.

Donc, c'est une longue histoire courte: Oui, avoir de fusion s'engage est parfaitement bien et vous ne devriez pas vous soucier d'eux.

52voto

Bill Door Points 2561

Cette réponse a été révisée, selon ma compréhension, les diagrammes, et les conclusions ont été incorrect.


git pull des causes de fusion s'engage parce que git est la fusion. Cela peut être modifié par le réglage de vos branches à utiliser rebase au lieu de fusionner. L'aide de rebase au lieu de fusionner sur un pull prévoit une histoire linéaire de l'espace de stockage partagé. D'autre part, de fusion s'engage montrer les efforts de développement en parallèle sur la branche.

Par exemple, deux personnes travaillent sur la même branche. La branche commence comme:

...->C1

La première personne à finir leur travail et pousse à la direction générale:

...->C1->C2

La deuxième personne termine son travail et veut pousser, mais ne peuvent pas car ils ont besoin de mise à jour. Le référentiel local de la deuxième personne ressemble:

...->C1->C3

Si le pull est définie à fusionner, la seconde personnes référentiel va ressembler.

...->C1->C3->M1
      \      /
       ->C2->

Où M1 est une fusion de commettre. Cette nouvelle branche de l'histoire seront poussés à la repo. Si au lieu de cela, le pull est mis à rebase le local repo ressemblerait à:

...->C1->C2->C3

Il n'y a pas de fusion s'engager. L'histoire a été rendue plus linéaire.

Les deux choix reflètent l'histoire de la branche. git vous permet de choisir l'histoire que vous préférez.

Il y a effectivement des endroits où cela peut provoquer un problème avec les branches distantes. Ce n'est pas un de ces cas. Nous préférons utiliser le rebase comme ça simplifie déjà compliqué l'histoire de la branche ainsi que le montre une version de l'histoire par rapport au référentiel partagé.

Vous pouvez définir la branche.autosetuprebase=toujours avoir git d'établir automatiquement vos branches distantes que rebase au lieu de maître.

git config --global branch.autosetuprebase always

Ce paramètre provoque git pour créer automatiquement un paramètre de configuration pour chaque branche à distance:

branch.<branchname>.rebase=true

Vous pouvez définir vous-même de votre télécommande branches qui sont déjà en place.

git config branch.<branchname>.rebase true

Je tiens à remercier @LaurensHolst de l'interrogatoire et de la poursuite de mes précédentes déclarations. J'ai certainement appris plus sur le fonctionnement de git fonctionne avec la traction et de fusion s'engage.

Pour plus d'informations sur la fusion de livraison vous pouvez lire à Contribuer à un Projet en ProGit. Le Petit de l'Équipe de la section montre de fusion s'engage.

7voto

kclair Points 1066

Un git pull insérer la "Fusion de la direction générale des messages, c'est juste ce qu'il fait. En faisant un git pull, vous avez fusionné la branche distante dans votre succursale locale.

Lorsque vous faites un git pull et il y a des conflits, le git log indique que les mises à jour les fichiers en conflit comme émanant de l'utilisateur qui a résolu les conflits. Je suppose que c'est parce que la personne qui résout le conflit s'engage le fichier.

Pour autant que je sais que c'est juste la façon dont git fonctionne, et il n'y a pas un moyen de contourner cela.

La relocalisation va souffler l'historique de git, donc vous ne serez pas en mesure de voir les fusionne s'est produite.

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