2013-04-11 5 views
7

Angenommen, die zeigt dieses Diagramm:Wie kann ich das erste Commit einer Verzweigung finden?

A -- B -- C -- D -- E -- F 
     \ 
     G -- H -- I 

Ich möchte G finden, um zu einem interaktiven Fütterungsmaterial in der Lage sein, die Festschreibungen zu quetschen (aber man immer noch auf dem Thema Zweig begehen halten), die überprüft werden und fusionierte später. Ich möchte nicht nur den ganzen Zweig neu erstellen, weil ich die Information behalten möchte, dass es einen Zweig gab und es zusammengeführt wurde.

(Ich weiß, dass ich die Geschichte betrachten und einfach die SHA-Prüfsumme des Commits verwenden kann, aber ich bin auf der Suche nach einem Weg, ohne die Informationen manuell auszugraben oder zu zählen, wie viele Commits gemacht und verwendet wurden ~ von HEAD mit dieser Nummer).

Edit: Klarstellung von dem, was ich erreichen möchte:

Ich möchte dies vermeiden:

A -- B -- C -- D -- E -- F -- J 
     \     /
     G -- H -- I -- -- -- - 

Und anstatt etwas wie dieses:

A -- B -- C -- D -- E -- F -- J 
     \     /
     G' -- -- -- -- -- -- - 

Mit anderen Worten, ich Ich möchte die Commits mit einer interaktiven Rebase für den Zweig in einen Zweig zerquetschen, aber die Verzweigung beibehalten und eine regelmäßige Zusammenführung verwenden, um die Änderungen aus dem Zweig in den Master zu integrieren.

+0

Siehe http://stackoverflow.com/questions/1527234/finding-a-branch-point-with-git –

+1

Das ist eine andere Frage. Es wird sogar so erklärt wie ich. Wenn wir es in mein Beispiel übersetzen, sucht er nach "B", aber ich suche nach "G". –

Antwort

11

Es gibt keine Commits "auf einem Zweig" in Git. Es gibt nur Commits erreichbar von einer Niederlassung. Und diese Information ist kein sehr guter Indikator dafür, zu welchem ​​Zweig dieses Commit ursprünglich gehörte. So sehe ich zwei Möglichkeiten, um Ihre Frage zu interpretieren:

  • möchte ich finden die erste begehen nach der Zusammenführung Basis von branch und master, die auf der Seite der Niederlassung ist.
  • Ich möchte die erste Festschreibung finden, die von branch, aber nicht von master erreichbar ist.

Ich werde davon ausgehen, dass Sie die zweite gemeint haben. Die Antwort auf diese Frage wird von diesem Befehl zurück:

git rev-list ^master mybranch | tail -n 1 

Hinweis: Das ist alles werde nicht schrecklich, wenn Sie Thema Zweige abzweigen.


Ich bin ein wenig verwirrt, was Sie erreichen wollen. Wenn Sie eine ganze Zweig vertreten sein wollen, indem man begehen, aber immer noch eine Zusammenführung erhalten, sollten Sie dies tun:

git checkout mybranch 
git reset --soft `git merge-base mybranch master` 
git commit -m 'All of Mybranch' 
git checkout master 
git merge --no-ff mybranch 

Beachten Sie, dass dies die Squash in der ersten Merge-Basis beginnen. Dies ist möglicherweise nicht das, was Sie möchten, wenn Sie zuvor master in mybranch zusammengeführt haben. Sie können dies ändern, an dem ersten commit auf mybranch zu starten, aber nicht auf Master (vielleicht wierd und unerwartete Ergebnisse in komplexen Geschichten haben) durch den zweiten Befehl mit diesem ersetzen:

git reset --soft `git rev-list ^master mybranch | tail -n 1`^ 
+0

Danke. Ich habe eine Erklärung hinzugefügt, was ich tun möchte, sehe meine Änderungen. –

+0

habe ich so angenommen - genau das erkläre ich in meiner Antwort. – Chronial

+0

Großartig, das funktioniert sehr gut. Vielen Dank. –

4

Sie B mit git merge-base

git merge-base F I 

Oder einfacher mit

git merge-base my_branch my_other_branch 

Sie können mit dem Ergebnis

git rebase -i B 

Und halten Sie dann rebase bekommen nur die ersten G begehen, während alle anderen quetschen.

+0

Das ist ziemlich schlau. –

1

git merge-base werden Sie B. Sie wollen alle direkten Kinder von B, die auch Vorfahren von mir sind. Das ist im Zusammenhang mit How do I find the next commit in git? und Referencing the child of a commit in Git. Versuchen Sie so etwas wie:

root=$(git merge-base master topic-branch) 

git rev-list --parents ^$root topic-branch | grep " $root" | cut -f1 -d' ' 

Dieses alle Commits der Spitze des topic-branch von der Wurzel Liste wird zusammen mit ihren Eltern und die, die zeigen, wo die Eltern ist die merge-base Wurzel.

Da ein Themenzweig Zusammenführungen enthalten kann, gibt es topologisch möglicherweise mehrere "erste" Festlegungen in einem Zweig.

Verwandte Themen