Git pull résultats en étrangers “Fusion de la direction générale des messages 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
- L'un de nous (appelons-le développeur, mais il n'est pas question que l'on pousse un ensemble de commits sur GitHub..
- L'autre (développeur B) fait quelques modifications locales.
- B n'a
git pull
. - B n'a
git push
. - À la recherche à la livraison du journal de l'historique, je vois de Fusion de la branche "master" de github.com:foo/bar
Le journal de validation 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?
- Vous pouvez afficher le journal sans se confond avec
git log --no-merges
Vous devez vous connecter pour publier un commentaire.
Le commit que vous voyez est parfaitement bien. Un
pull
s'exécute efficacementgit fetch
et puisgit merge
donc une opération de fusion est généralement qui se passe lorsque vous exécutezgit 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érents 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 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 permet également à la original 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.
extraneous “Merge branch” messages in commit log
☺ Mais jamais l'esprit, depuis que j'ai commenté, j'ai poussé un code de github, et je ne vois pas ce message là.2 commits ahead
, et aucun d'eux n'a le message.Cette réponse a été révisée, selon ma compréhension, les diagrammes, et les conclusions ont été incorrect.
git pull
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:
La première personne à finir leur travail et pousse à la direction générale:
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:
Si le pull est définie à fusionner, la seconde personnes référentiel va ressembler.
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 à:
Il n'y a pas de fusion s'engager. L'histoire a été rendue plus linéaire.
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.
Ce paramètre provoque git pour créer automatiquement un paramètre de configuration pour chaque branche distante:
Vous pouvez définir vous-même de votre télécommande branches qui sont déjà en place.
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 dans ProGit-Livre. Le Privé Petite Équipe section montre de fusion s'engage.
Que vous pouvez faire:
Cependant, ce sera toujours de mettre vos modifications sur le dessus de vos collaborateurs. Mais vous n'aurez pas de polluants de fusion message.
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.
Rebasage va souffler l'historique de git, donc vous ne serez pas en mesure de voir les fusionne s'est produite.
Il est en fait beaucoup plus simple de répondre à cette question. Juste développeur B faire un pull AVANT de faire son commit. Cela permettra d'éviter ceux de fusion s'engage, car ils sont causés par l'histoire que vous avez créé sur votre repo de votre validation essayant de fusionner avec l'histoire de la s'engage sur la télécommande repo. Si vous recevez un message disant quelque chose le long des lignes de "modifications seront écrasées' quand vous faites une traction, il signifie simplement que vous deux ont touché le même fichier, ce qui n':
ensuite, vous pouvez résoudre les conflits de fusion si il y a de tout.
stash
avant de vouspull
. Pouah git m'oblige à être au top de mon jeu de tous les temps.git pull --rebase
à intégrer à distance modifications avant de les locaux, peu importe.