2015-07-16 4 views
14

Ich bin heute Morgen aufgewacht und habe mir die Commit-Historie eines meiner privaten Repositories auf BitBucket angesehen. Ich sah dies:Warum führt Git eine Verzweigung in sich zusammen?

Anonymbegangen fcde879 MERGE

Merge Zweig 'entwickeln' von https://bitbucket.org/abc/xyz in entwickeln

Das ist, äh, etwas ungewöhnlich. Meine Vermutung war, dass dies von einer neuen Maschine geschoben wurde, die git nicht richtig konfiguriert hatte. Trotzdem war ich nicht sicher, warum es so war. Auf BitBucket zeigt es zwei separate Hashes als die Commit-Eltern, aber es hat nicht die "View Raw Commit" -Option von anderen Commits.

Ich habe diesen Zweig ausgecheckt, gezogen und das Protokoll manuell angesehen.

[email protected]:/path/to/repo$ git log -1 --format=raw 
tree 2931d14f48e61eaf0bbe0660af5b5dd76c07f063 
parent 6bb38dee681df7620ffa42b6790641a7873166f2 
parent f59c82e19e3e79310a53e273bab78139c49ff063 
author root <[email protected]> 1437069530 +0000 
committer root <[email protected]> 1437069530 +0000 

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

Soweit ich das beurteilen kann, sind die 6bb Eltern auf der Entwicklung Zweig und der f59 Elternteil erscheint aus einem anderen Zweig zu sein. Es ist schwer zu sagen, was vor sich geht.

Ich suchte, konnte aber keine Antwort finden, und ich muss zurück zum Grind, also setze ich meine Frage hier: Warum verschmelzt git einen Zweig in sich selbst? Oder, warum wird diese Nomenklatur als Commit-Nachricht verwendet?

Antwort

30

Dieses Szenario ist nicht ungewöhnlich.

Der Schlüssel hier ist, dass die Zweige, die zusammengeführt werden, unterschiedlich sind: Es ist der Zweig develop des Remote-Repository, der in den lokalen (arbeitenden) Zweig des Entwicklers develop zusammengeführt wird.

im lokalen Repository Entwickler gibt es zwei verschiedene Zweige:

  • develop = Der Zweig er/sie gerade arbeitet. Die neuen Commits gehen hier hin.
  • origin/develop = Dies ist im Wesentlichen ein Snapshot, den das aktuelle Repository über den Status des Zweigs develop auf dem Remote-Server enthält. Es wird aktualisiert mit den Remote-Änderungen, wenn Sie fetch oder pull, und mit den lokalen Änderungen nach einer erfolgreichen push.

Jetzt, wenn Sie git pull tun, passieren zwei Dinge. Dies liegt daran, git pull im Wesentlichen ein Alias ​​für andere zwei git Operationen ist: fetch und merge:

  • fetch - bringt alle Commits (falls vorhanden) aus der Remote-Repository auf den lokalen origin/develop Zweig.
  • merge - nimmt die neuen Commits und wendet sie auf die lokale Arbeit develop branch.Dies in einem von zwei Wegen geschehen:
    • , wenn der lokale Arbeitszweig nicht divergent Geschichte enthält (neu verpflichtet, dass die Fern nicht kennen), dann geht es einfach den develop Verzweigungszeigerarm voraus, tut, dass es Punkte bis zum letzten Commit in origin/develop. Dies wird als Schnellvorlauf Merge bekannt.
    • Wenn der Entwickler einige neue Commits hat, die nicht im Remote-Repo vorhanden sind, und daher nicht im Zweig origin/develop, wird eine regelmäßige Zusammenführung durchgeführt, was bedeutet, dass es ein neues Commit gibt, das die Änderungen von beiden enthält Geäst. Standardmäßig weist git solchen Commits solche Nachrichten zu: Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop.

So ist das Szenario ein ziemlich allgemeines.

Nun, wenn das sehr oft passiert und Sie nicht sehr komplexe Commit-Verlaufsgraphen sehen möchten, die Commits enthalten, wie die, über die wir gerade sprechen, versuchen Sie es mit using rebase instead of merge.

Sie können diese zwei Arten tun (wenn die Änderungen von dem Remote-Server bekommen):

  • git fetch; git rebase
  • git pull --rebase
+0

Danke, sehr informativ. Alles ist jetzt so klar. –

4

Der Besitzer hatte einige Commits auf entwickeln, dass sie nicht gedrängt hatte, dann git pull lief und neue Commits von entwickelt, die in der Remote-Repo waren.

0

ich die gleiche Art von Nachricht erhalten haben. Merge branch 'feature/customfeature' of https://mylocalrepo.com/project.git into develop und es hat noch nichts gebrochen lol ... also keine Panik. Es verbindet nur den entfernten Entwicklungszweig in Ihren lokalen Entwicklungszweig. Solange keine Konflikte entstehen, sollten Sie gut sein :)

0

zu gehen, wenn Sie diese Art von Merge Stash vermeiden wollen, bevor ziehen, wie folgt aus:

git stash 
git pull 
git stash pop 
Verwandte Themen