Je travaille avec un autre développeur sur un projet et nous utilisons Github comme dépôt distant. Je suis sur un Mac utilisant git 1.7.7.3, il est sous Windows avec git 1.7.6.
C'est ce qui se passe
- L'un de nous (appelons-le développeur A, mais peu importe lequel) pousse un ensemble de commits vers GitHub.
- L'autre (développeur B) fait des commits locaux.
- B fait un
git pull
. - B fait un
git push
. - En regardant le journal de l'historique des validations, je vois Merge branch 'master' de github.com:foo/bar
Le journal de validation est jonché de messages "Fusionner la branche" au fil du temps, et montre également que le développeur B commet les modifications apportées par le développeur A. 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 effets secondaires le rebasage introduira. C'est la première fois que je travaille sur un dépôt git multi-développeurs, est-ce donc juste un comportement normal? Des idées sur la façon de résoudre ce problème?
git log --no-merges
Réponses:
Le commit que vous voyez est parfaitement bien. A
pull
s'exécute efficacementgit fetch
, puisgit merge
une fusion se produit généralement lorsque vous exécutezgit pull
.L'alternative d'utiliser le rebasage au lieu de la fusion est possible, mais vous devez généralement l'éviter. Le rebasage vous permet de conserver un historique linéaire, mais supprime également toute information sur le branchement qui s'est produit à l'origine. Cela entraînera également la réécriture de l'historique de la branche actuelle, recréant tous les commits qui ne sont pas contenus dans la branche cible (dans votre cas, la télécommande). Comme les commits recréés sont des commits différents , cela peut causer beaucoup de confusion lors du développement avec d'autres, en particulier lorsque les gens ont déjà extrait des parties de ces commits avant qu'ils ne soient réécrits (par exemple avec des branches de fonctionnalités). Donc, en règle générale, vous ne devriez jamais réécrire un commit qui a déjà été poussé.
Les commits que vous voyez sont là pour combiner deux (ou plus) branches. C'est parfaitement bien d'avoir un commit qui ne fait rien d'autre que de fusionner plusieurs branches. En fait, cela est très clair lorsque vous avez un commit de fusion qui combine des branches lorsque vous regardez l'historique. Par rapport au rebasage, la fusion vous permet également de voir efficacement l' historique d' origine tel qu'il a été développé, y compris les branches réelles qui coexistaient.
Donc, pour faire court: oui, avoir des validations de fusion est parfaitement bien et vous ne devriez pas vous en soucier.
la source
Cette réponse a été révisée, car ma compréhension, les diagrammes et les conclusions étaient incorrects.
git pull
provoque des validations de fusion car git fusionne. Cela peut être changé en paramétrant vos branches pour utiliser le rebase au lieu de la fusion. L'utilisation du rebase au lieu de la fusion sur une extraction fournit un historique plus linéaire au référentiel partagé. D'autre part, les commits de fusion montrent les efforts de développement parallèles sur la branche.Par exemple, deux personnes travaillent sur la même succursale. La branche commence comme:
La première personne termine son travail et pousse à la succursale:
La deuxième personne termine son travail et veut pousser, mais ne peut pas parce qu'elle doit mettre à jour. Le référentiel local de la deuxième personne ressemble à ceci:
Si l'extraction est définie pour fusionner, le deuxième référentiel de personnes ressemblera à.
Où M1 est un commit de fusion. Cette nouvelle histoire de branche sera poussée vers le repo. Si à la place, l'extraction est définie pour rebaser le dépôt local ressemblerait à ceci:
Il n'y a pas de validation de fusion. L'histoire a été rendue plus linéaire.
Les deux choix reflètent l'histoire de la succursale. git vous permet de choisir l'historique que vous préférez.
Il existe en effet des endroits où le rebase peut poser problème avec les branches distantes. Ce n'est pas un de ces cas. Nous préférons utiliser rebase car il simplifie un historique de branche déjà compliqué et montre une version de l'historique relative au référentiel partagé.
Vous pouvez définir branch.autosetuprebase = always pour que git établisse automatiquement vos branches distantes en tant que rebase au lieu de master.
Ce paramètre oblige git à créer automatiquement un paramètre de configuration pour chaque branche distante:
Vous pouvez le définir vous-même pour vos succursales distantes déjà configurées.
Je tiens à remercier @LaurensHolst pour ses questions et pour la suite de mes déclarations précédentes. J'ai certainement appris plus sur le fonctionnement de git avec les commits pull et merge.
Pour plus d'informations sur les validations de fusion, vous pouvez lire Contribuer à un projet dans ProGit-Book . La section Petite équipe privée affiche les validations de fusion.
la source
Tu peux faire:
Cependant, cela placera toujours vos modifications au-dessus de celles de vos collaborateurs. Mais vous ne recevrez aucun message de fusion polluant.
la source
Il existe en fait une réponse beaucoup plus simple à cela. Demandez simplement au développeur B de faire un pull AVANT de faire sa validation. Cela empêchera ces validations de fusion, car elles sont causées par l'historique que vous avez créé sur votre dépôt local à partir de votre validation locale en essayant de fusionner avec l'historique des validations sur le dépôt distant. Si vous recevez un message disant quelque chose du genre `` les modifications seront écrasées '' lors d'une extraction, cela signifie simplement que vous avez tous les deux touché le même fichier, alors faites:
alors vous pouvez résoudre tous les conflits de fusion s'il y en a.
la source
stash
avant vouspull
. Ugh git m'oblige à être au top de mon jeu tout le temps.git pull --rebase
intégrer les modifications à distance avant les modifications locales, peu importe.Faire un git pull insérera les messages "Merge branch", c'est exactement ce qu'il fait. En effectuant un git pull, vous avez fusionné la branche distante dans votre branche locale.
Lorsque vous effectuez une extraction git et qu'il y a des conflits, le journal git affichera les mises à jour des fichiers en conflit comme provenant de l'utilisateur qui a résolu les conflits. Je suppose que c'est parce que la personne qui résout le conflit réengage le fichier.
Autant que je sache, c'est comme ça que fonctionne git, et il n'y a pas moyen de contourner cela.
Le rebasage épatera l'historique de git, vous ne pourrez donc pas voir quand les fusions ont eu lieu.
la source