2009-10-10 9 views
568

Wie findet man den letzten gemeinsamen Vorfahren zweier Git-Zweige?Finde den letzten gemeinsamen Vorfahren zweier Git-Zweige

+3

definieren letzte: reale Welt, die Anzahl der Commits, andere Metrik? –

+2

Relevant (kreuzweise Verschmelzungen): http://stackoverflow.com/questions/26370185/how-do-criss-cross-merges-arise-in-git – Jubobs

Antwort

661

Sie suchen nach git merge-base. Verbrauch:

$ git merge-base branch2 branch3 
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 
+58

Beachten Sie, dass dies den neuesten gemeinsamen Vorfahren ... der findet Ich glaube, was der Fragesteller will, also +1. Ich erwähne es nur für den Fall, dass jemand hierher kommt, um den * ältesten * gemeinsamen Vorfahren zu finden (wie ich es tat) - siehe dazu auch: http://stackoverflow.com/questions/1527234/finding-a-branch-point -with-git – lindes

+1

Dies ist wahrscheinlich, was er gesucht hat, aber die man-Seite garantiert nicht, dass es das Neueste in Echtzeit oder Anzahl der Commits sein wird: nur dass es einer der besten gemeinsamen Vorfahren sein wird. –

+0

Ich denke, ich werde diesen kleinen Ausschnitt viel verwenden: '$ (git merge-base HEAD Master)'. Zum Beispiel 'git log $ (git merge-base HEAD-Master) .. HEAD' – funroll

-1

Einmal erworben, kann der gemeinsame Vorfahr SHA verwendet werden, beispielsweise die verfügbaren Commits auf der Fernbedienung, um zu sehen, wie so:

#!/bin/bash 

git remote update 
REMBR=`git show-remote-branch` 
REMHEAD=`git rev-parse $REMBR` 
MERGEBASE=`git merge-base HEAD $REMBR` 
REMURL=`git config remote.origin.url` 

git request-pull $MERGEBASE $REMURL $REMHEAD 
+2

Dies scheint ziemlich tangential zu dem, was tatsächlich gefragt wurde. –

17

git diff master...feature

zeigt alle neuen Commits Ihres aktuellen (möglicherweise multi-commit) Feature-Zweiges.

man git-diff Dokumente, die:

git diff A...B 

ist die gleiche wie:

git diff $(git merge-base A B) B 

aber die ... ist einfacher zu tippen und zu erinnern.

Wie erwähnt by Dave, kann der Spezialfall HEAD entfallen. Also:

git diff master...HEAD 

ist die gleiche wie:

git diff master... 

, die genug ist, wenn der aktuelle Zweig feature ist.

Schließlich, erinnern Sie sich, dass Reihenfolge wichtig ist! Doing git diff feature...master zeigt Änderungen, die auf master nicht auf feature sind.

Ich wünschte, mehr Git-Befehle würden diese Syntax unterstützen, aber ich denke nicht, dass sie es tun. Und einige haben sogar eine andere Semantik für ...: What are the differences between double-dot ".." and triple-dot "..." in Git commit ranges?

+5

Oder einfach 'git diff master ...' im Spezialfall von 'HEAD' differieren – Dave

4

Mit gitk können Sie die beiden Zweige sehen grafisch:

gitk branch1 branch2 

Und dann ist es einfach, den gemeinsamen Vorfahren in der Geschichte der beiden Zweige zu finden.

+1

Nicht alles kann in jedem Fall visuell gemacht werden. Es gibt Gründe, warum Dinge möglicherweise programmatisch automatisiert werden müssen. – ADTC

9

Wie in einer vorherigen Antwort erwähnt, git merge-base Werke:

$ git merge-base myfeature develop 
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

aber wenn myfeature der Stromzweig ist, wie es üblich ist, können Sie die Verwendung --fork-point verwenden:

$ git merge-base --fork-point develop 
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

Dieses Argument funktioniert nur in neueren Versionen von Git. Siehe auch this answer.


Für vollständige Informationen begehen, betrachten:

$ git log -1 $(git merge-base --fork-point develop) 
+0

Ich habe 'git Version 2.14.1.windows.1'. Running 'git merge-base --fork-point branch2' mit einer Verzweigung _ (mit eigenen commits) _ dass ** ich weiß ** hat aus dem aktuellen Zweig gespalten ergibt kein Ergebnis, während' git merge-base branch1 branch2' zeigt korrekt den Verzweigungspunkt. Was könnte das Problem sein? – ADTC

+0

@ADTC Checkout 'branch2' und dann' git merge-base --fork-point branch1'. –

+0

Ja, tat das. Nichts ist wieder aufgetaucht. – ADTC

Verwandte Themen