Im folgenden Beispielbaum:
A-B-C-D-E (master branch)
\
F-G-H (xxx branch)
Ich suche nach F - dem ersten Commit im xxx-Zweig. Ich denke, dass es möglich ist mit:
git log xxx --not master
und das zuletzt aufgeführte Commit sollte F sein. Ist es die richtige Lösung oder gibt es einige Nachteile?
Ich weiß, dass es ähnliche Fragen zum Stapelüberlauf gab, aber niemand hat eine solche Lösung vorgeschlagen, und ich bin mir nicht sicher, ob ich es richtig mache.
Antworten:
Wobei "Zweig" Ihr spezifischer Zweigstellenname ist. Der Punkt-Punkt gibt Ihnen alle Commits an, die der Zweig hat, den der Master nicht hat.
tail -1
Gibt die letzte Zeile der vorherigen Ausgabe zurück.quelle
master
. Solange Ihre Verzweigung nicht gelöscht wurde,git log <sha>..branch --oneline | tail -1
sollten Sie dennoch die gewünschten Ergebnisse erhalten.--reverse
, um die Protokolle mit Farben usw. rückwärts zu lesenSie sollten die
merge-base
Funktionalität verwenden, mit der genau dies gelöst werden soll:quelle
quelle
Wenn Ihr Zweig (der alte) wieder mit dem Master zusammengeführt wird, wird das erwartete Ergebnis nicht angezeigt. Ich habe das Python-Skript verwendet, um die ID für das Festschreiben des ersten Zweigs zu finden.
git rev-list - erster übergeordneter Änderungssatz
- Erster Elternteil folgt nur dem ersten übergeordneten Commit, wenn ein Merge-Commit .
Iterieren Sie die Änderungssätze vom obigen Befehl, bis der übergeordnete Zweig gefunden wurde.
quelle
Dies gibt Ihnen jedoch nur das erste Commit für Zweig xxx, das sich nicht im Master befindet, nicht das erste Commit für Zweig xxx. Letzteres wäre schwierig, wenn der Zweig xxx einmal oder mehrmals gelöscht und / oder neu erstellt worden wäre. In diesem Fall könnten Sie Folgendes versuchen:
quelle
head -n 1
stattdessen schreibentail -1
?tail -1
Gibt das letzte Commit anstelle des ersten zurück.git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1
quelle