2012-05-09 25 views
8

Wie kann man den vorherigen Merge-Commit zwischen zwei Zweigen finden?Wie finden Sie den vorherigen Merge-Commit?

Ich möchte die Änderungen in meinem Master-Zweig sehen, seit ich den Release-Zweig das letzte Mal in den Master-Zweig zusammengeführt habe. Um die Änderungen im Versionszweig seit der letzten Verzweigung zu sehen, ist es so einfach wie git diff ...release

Aber offensichtlich git diff release... funktioniert nicht, weil es auch alle Änderungen vor der letzten Zusammenführung enthält. So denke ich, dass ich die ID der letzten Zusammenführung verpflichten müssen es passieren zu git diff

git log --reverse --ancestry-path `git merge-base HEAD release`.. \ 
     --format=format:%H|head -n1 

scheint zu funktionieren und kann mit git diff $(...) verwendet werden, aber es scheint furchtbar kompliziert. Gibt es eine einfachere Lösung?

Beispiel

I 
/\ 
A1 B1 
\ | 
| M 
| | 
A2 B2 

Hier I ist die erste begehen. A[12] sind die Freigabe-Commits und B[12] sind die Master-Commits. M ist das vorherige Commit. In dem Beispiel sind die Änderungen zwischen der letzten Zusammenführung und dem Master nur die durch B2 eingeführten Änderungen. git merge-base A2 B2 liefert A 1. Und git diff B2 A1 enthält die Änderungen von B1. Daher stellt sich die Frage, wie man M im allgemein komplexeren Fall findet, so dass man git diff M B2 ausführen kann, ohne M manuell finden zu müssen.

+0

Dies ist nicht der effizienteste Weg, aber Sie können 'git log --graph --oneline' betrachten, um das Commit zu finden. – Shahbaz

Antwort

-1

Dies wird die letzte merge commit zwischen Zweig foo und Zweig Master zeigen

git log foo master --oneline --date-order --merges -1 

--oneline is just to keep the output short 
--date-order to get the latest first 
--merges to only show merge commits 
-1 to display the first result only 
+3

Dieser Befehl scheint mir die letzte Zusammenführung in jedem Zweig zu geben. Dies beinhaltet auch die Kombination von Master oder Foo mit etwas anderem. Aber ich hätte gerne die letzte Verschmelzung von Foo mit Master und nichts anderem. –

+0

Dieser Befehl ist nützlich, um die letzte Zusammenführung von einer Verzweigung zu erhalten, wenn Sie nur eine Verzweigung protokollieren: git log master --oneline [...] –

6

Es scheint, für das, was Sie suchen, der Punkt, an dem die beiden Zweige begannen die beiden zu unterscheiden, nicht die letzten Zusammenführung zwischen Geäst. Diese beiden Konzepte unterscheiden sich, weil Ihr Release-Zweig möglicherweise einige Zeit nach der Zusammenführung schnell weitergeleitet wurde.

git merge-base master release finden den letzten gemeinsamen Vorfahren Ihres Masters und geben Zweige frei (d. H. Das letzte Commit, das die beiden gemeinsam haben).

Dann auf Master können Sie git diff [common ancestor] HEAD verwenden, um die Änderungen zu sehen, die seit dem gemeinsamen Vorfahren gemacht worden sind.

+0

Ich habe der Frage ein Beispiel hinzugefügt, um zu zeigen, warum 'git merge-base' von selbst löst das Problem nicht. –

+0

@Roland Shulz Ich verstehe. Ich werde versuchen, eine andere Antwort zu finden –

Verwandte Themen