Wie erhalte ich einen Commit-Verlauf für nur einen Zweig?

128

Lassen Sie uns sagen , dass ich einen neuen Zweig erstellt my_experimentaus masterund machte mehrere Commits my_experiment. Wenn ich tun , git logwenn auf my_experiment, sehe ich die auf diesen Zweig gemacht Commits, sondern auch die gemacht Commits mastervor der my_experimentsFiliale erstellt wurde.

Ich würde es sehr nützlich finden, die Historie aller Commits für den my_experimentsZweig zu sehen, bis die Erstellung dieses Zweigs erreicht ist - praktisch eine wahre Geschichte nur dieses Zweigs. Andernfalls ist mir beim Durchsuchen des Protokolls nicht klar, ob sich die Commits in der my_experimentsZweigstelle befanden oder nicht.

Gibt es eine Möglichkeit, dies mit Git zu tun?

Marplesoft
quelle

Antworten:

139

Sie können dazu einen Bereich verwenden.

git log master..

Wenn Sie Ihre my_experimentFiliale ausgecheckt haben . Dadurch wird verglichen, wo mastersich HEADdie Spitze befindet my_experiment.

Alex
quelle
3
Ok sprach zu früh. Das hat es für mein einfaches Beispiel getan. Aber jetzt schaue ich mir das echte Repo eines anderen an und es fällt mir ein, dass ich wissen muss, aus welchem ​​Zweig mein aktueller Zweig erstellt wurde, um diesen Befehl richtig zu verwenden. Vielleicht sollte ich das von gitk erzählen können, aber es ist mir nicht klar. Irgendwelche Gedanken?
Marplesoft
@Marplesoft Es kann kompliziert sein, das herauszufinden. Siehe diese Frage .
Alex
Können Sie kurz erklären, wie es funktioniert? Was sagt git log master..Git?
Tonix
2
@tonix den Link in der Antwort Folgen Sie für weitere Informationen darüber , wie ein Bereich arbeitet (die master..) Teil.
Alex
7

Mit dem git merge-baseBefehl können Sie einen gemeinsamen Vorfahren finden. Wenn also my_experiment noch nicht mit master zusammengeführt wurde und my_experiment aus master erstellt wurde, können Sie:

git log --oneline `git merge-base my_experiment master`..my_experiment
cforbish
quelle
Wenn Sie den Elternteil Ihres ersten Commits einschließen möchten, fügen Sie ^ und - Erster Elternteil hinzu : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
Eric Lavoie
7

Hinweis: Wenn Sie dieses Protokoll auf das letzte n Commit beschränken (die letzten 3 Commits, z. B. Git Log -3), stellen Sie sicher, dass zwischen 'n' und Ihrem Zweig ein Leerzeichen steht:

git log -3 master..

Vor Git 2.1 (August 2014) git log -3master..würde dieser Fehler tatsächlich die letzten 3 Commits des aktuellen Zweigs anzeigen (hier my_experiment), wobei das masterLimit ignoriert wird (dh wenn my_experimentnur ein Commit enthalten ist, werden noch 3 aufgelistet, 2 davon von master)

Siehe Commit e3fa568 von Junio ​​C Hamano ( gitster) :

Revision: " git log -<count>" genauer analysieren

Diese falsch eingegebene Befehlszeile ignoriert einfach " master" und zeigt am Ende zwei Commits aus dem aktuellen an HEAD:

$ git log -2master

weil wir " 2master" füttern , atoi()ohne sicherzustellen, dass die gesamte Zeichenfolge als Ganzzahl analysiert wird.

Verwenden Sie strtol_i()stattdessen die Hilfsfunktion.

VonC
quelle
1

Sie können nur verwenden git log --oneline

Manoj Rana
quelle
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
DebanjanB
1

Ich denke, eine Option für Ihre Zwecke ist git log --online --decorate. Auf diese Weise erfahren Sie, welches Commit aktiviert ist und welche Top-Commits für jeden Zweig in Ihrer Story vorhanden sind. Auf diese Weise haben Sie einen guten Überblick über die Struktur Ihres Repos und die mit einem bestimmten Zweig verbundenen Commits. Ich denke, das könnte helfen.

Daniel Casas
quelle
0

Ich weiß, dass es für diesen sehr spät ist ... Aber hier ist ein (nicht so einfacher) Oneliner, um das zu bekommen, wonach Sie gesucht haben:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • Wir listen Commits mit Filialnamen und relativen Positionen zu tatsächlichen Filialzuständen mit auf git show-branch(Senden der Warnungen an /dev/null).
  • Dann behalten wir nur diejenigen mit unserem Filialnamen in der Klammer mit grep -E "\[$BRANCH_NAME" .
  • Wo tatsächlich $BRANCH_NAMEmit erhalten wird git branch | grep -E '^\*' | awk '{ printf $2 }'(der Zweig mit einem Stern, der ohne diesen Stern wiedergegeben wird).
  • Aus unseren Ergebnissen entfernen wir die redundante Zeile am Anfang mit tail -n+2.
  • Und dann reinigen wir fianlly die Ausgabe, indem alles Entfernen vorhergehenden [$BRANCH_NAME]mit sed -E "s/^[^\[]*?\[/[/".
menssana
quelle