web-dev-qa-db-fra.com

Pourquoi git fusionne-t-il une branche en elle-même?

Je me suis réveillé ce matin et j'ai regardé l'historique des validations de l'un des référentiels privés de mon équipe de développement sur BitBucket. J'ai vu ça:

Anonyme validé fcde879 MERGE

Fusionner la branche 'develop' de https://bitbucket.org/abc/xyz en develop

C'est, euh, quelque peu inhabituel. Je suppose que cela a été poussé depuis une nouvelle machine qui n'avait pas configuré correctement git. Pourtant, je ne savais pas pourquoi il faisait cela. Sur BitBucket, il affiche deux hachages distincts en tant que parents de validation, mais il n'a pas l'option "Afficher la validation brute" des autres validations.

J'ai vérifié cette branche, tiré et regardé le journal manuellement.

sidious@DS-1:/path/to/repo$ git log -1 --format=raw
tree 2931d14f48e61eaf0bbe0660af5b5dd76c07f063
parent 6bb38dee681df7620ffa42b6790641a7873166f2
parent f59c82e19e3e79310a53e273bab78139c49ff063
author root <root@somemachine> 1437069530 +0000
committer root <root@somemachine> 1437069530 +0000

Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop

Pour autant que je sache, le parent 6bb est sur la branche develop et le parent f59 semble provenir d'une branche différente. C'est un peu difficile de dire ce qui se passe.

J'ai cherché mais je n'ai pas trouvé de réponse, et j'ai besoin de revenir au Grind, donc je pose ma question ici: pourquoi git fusionne-t-il une branche en elle-même? Ou plutôt, pourquoi cette nomenclature est-elle utilisée comme message de validation?

34
Jonathan Voss

Ce scénario n'est pas inhabituel.

La clé ici est que les branches fusionnées sont différentes: c'est la branche develop du référentiel distant qui est fusionnée dans la branche locale (de travail) develop du développeur.

Dans le référentiel local du développeur, il existe deux branches distinctes:

  • develop = La branche sur laquelle il travaille actuellement. Les nouveaux commits vont ici.
  • Origin/develop = Il s'agit essentiellement d'un instantané que le référentiel actuel contient sur l'état de la branche develop sur le serveur distant. Il est mis à jour avec les modifications à distance lorsque vous effectuez fetch ou pull, et avec les modifications locales après un Push réussi.

Maintenant, quand vous faites git pull, deux choses se produisent. Ceci est dû au fait git pull est essentiellement un alias pour les deux autres opérations git: fetch et merge:

  • fetch - apporte toutes les nouvelles validations (le cas échéant) du référentiel distant au local Origin/develop branche.
  • merge - prend les nouveaux commits et les applique au travail local develop branch. Cela peut se produire de deux manières:
    • si la branche de travail locale ne contient pas d'historique divergent (nouvelles validations que la télécommande ne connaît pas), elle avance simplement le pointeur de branche develop en avant, de sorte qu'il pointe vers la dernière validation dans Origin/develop. Ceci est connu comme une fusion rapide .
    • si le développeur a de nouveaux commits qui ne sont pas présents dans le référentiel distant, et donc pas dans le Origin/develop branche, puis une fusion régulière est effectuée, ce qui signifie qu'il y a un nouveau commit, contenant les modifications des deux branches. Par défaut, git affecte des messages comme ceux-ci à de tels commits: Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop.

Donc, le scénario est assez courant.

Maintenant, si cela se produit très souvent et que vous n'aimez pas voir des graphiques d'historique de commit très complexes contenant des commits comme celui dont nous parlons, essayez de regarder en utilisant rebase au lieu de fusionner =.

Vous pouvez procéder de deux manières (lors de l'obtention des modifications à partir du serveur distant):

  • git fetch; git rebase
  • git pull --rebase
66
Cristian Lupascu

Le propriétaire avait des engagements à développer qu'il n'avait pas poussés, puis a couru git pull et récupéré/fusionné dans les nouveaux commits de develop qui se trouvaient dans le dépôt distant.

11
mipadi

Si vous voulez éviter ce type de cache de fusion avant de tirer, comme ceci:

git stash
git pull
git stash pop
2
Dave DeCarlo

J'ai reçu le même type de message. Merge branch 'feature/customfeature' of https://mylocalrepo.com/project.git into develop et il n'a encore rien cassé lol ... alors ne paniquez pas. Il ne fait que fusionner la branche de développement distante dans votre branche de développement locale. Tant qu'aucun conflit ne survient, vous devriez être bon pour aller :)

0