Wie zeige ich das erste Commit von 'git log'?

288

Ich habe ein Projekt, das eine lange Geschichte hat. Ich möchte das erste Commit für Git zeigen.

Wie mache ich das?

Nyambaa
quelle
2
Ich habe nur einen Weg gefunden, den letzten zu zeigen git log -1.
Alex
5
mögliches Duplikat von git: Wie verweise ich auf das anfängliche Commit?
Chris Johnsen

Antworten:

298

Kurze Antwort

git rev-list --max-parents=0 HEAD

(Aus Tihos Kommentar . Wie Chris Johnsen bemerkt , --max-parentswurde er eingeführt, nachdem diese Antwort veröffentlicht wurde.)

Erläuterung

Technisch gesehen kann es mehr als ein Root-Commit geben. Dies geschieht, wenn mehrere zuvor unabhängige Historien zusammengeführt werden. Es ist üblich, wenn ein Projekt über eine Teilbaumzusammenführung integriert wird .

Das git.gitRepository enthält sechs Root-Commits in seinem Verlaufsdiagramm (jeweils eines für Linus 'anfängliches Commit, gitk , einige anfänglich separate Tools, git-gui , gitweb und git-p4 ). In diesem Fall wissen wir, dass dies das e83c516ist, an dem wir wahrscheinlich interessiert sind. Es ist sowohl das früheste Commit als auch ein Root-Commit.

Im allgemeinen Fall ist das nicht so einfach.

Stellen Sie sich vor, libfoo befindet sich seit einiger Zeit in der Entwicklung und speichert seinen Verlauf in einem Git-Repository ( libfoo.git). Unabhängig davon befindet sich das "Bar" -Projekt ebenfalls in der Entwicklung (in bar.git), jedoch nicht so lange libfoo (das Commit mit dem frühesten Datum in libfoo.githat ein Datum, das dem Commit mit dem frühesten Datum in vorausgeht bar.git). Irgendwann beschließen die Entwickler von "bar", libfoo mithilfe einer Teilbaumzusammenführung in ihr Projekt aufzunehmen. Vor dieser Zusammenführung war es möglicherweise trivial, das „erste“ Festschreiben zu bestimmen bar.git(es gab wahrscheinlich nur ein Root-Festschreiben). Nach dem Zusammenführen gibt es jedoch mehrere Root-Commits, und das früheste Root-Commit stammt tatsächlich aus der Geschichte von libfoo, nicht "Bar".

Sie finden alle Root-Commits der History-DAG folgendermaßen:

git rev-list --max-parents=0 HEAD

Wenn dies --max-parentsnicht verfügbar ist, funktioniert dies auch:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

Wenn Sie nützliche Tags eingerichtet haben, erhalten Sie git name-revmöglicherweise einen schnellen Überblick über den Verlauf:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin

Bonus

Oft benutzen? Schwer zu merken? Fügen Sie einen Git-Alias ​​für den schnellen Zugriff hinzu

git config --global alias.first "rev-list --max-parents=0 HEAD"

Jetzt können Sie einfach tun

git first
Chris Johnsen
quelle
49
Ich glaube, das git rev-list --max-parents=0 HEADwird das Gleiche tun und ist ein bisschen einfacher.
Bis zum
3
@tiho: Ja, es macht das gleiche und ist einfacher; obwohl diese Option zum Zeitpunkt dieser Frage / Antwort noch nicht ganz „erfunden“ war .
Chris Johnsen
Es kommt zu mir , dass erste begehen mehr eines ist Blatt als ein begehen Wurzel begehen
TIWO
@tiho Ich denke, deine Antwort sollte eine eigene Antwort sein und nicht nur ein Kommentar. Auf diese Weise wird es prominenter und Sie erhalten verdiente Punkte.
Russell Silva
@RussellSilva Ich interessiere mich nicht für Punkte, aber ich glaube, dass es möglich ist, die Antworten anderer Leute zu bearbeiten, was wahrscheinlich besser wäre, als eine neue hinzuzufügen. Ich bin nicht wirklich zufrieden damit, es selbst zu tun,
zögern
414

Ich habe das gefunden:

git log --reverse

zeigt Commits von Anfang an.

Nyambaa
quelle
19
Interessanterweise git log --reverse -5lässt es das --reverseaus irgendeinem Grund ignorieren
Dan2552
6
@ Dan2552 Sieht aus wie ein Fehler, sollte gemeldet werden?
Saeedgnu
23
Es sieht so aus, als würde es zuerst die Ergebnisse auf 5 Einträge beschränken und dann umkehren
Unpololarität
3
@ 太極 者 無極 而 right ist richtig, das ist das dokumentierte Verhalten.
Seriousdev
43

Sie können Ihr Protokoll einfach umkehren und das erste Ergebnis anzeigen.

git log --pretty=oneline --reverse | head -1
Mohamed Mansour
quelle
7
git log --reversekehrt den Verlauf um, sodass Sie head -1statt verwenden müssen tail -1, um das erste Commit zu erhalten.
Rubiii
4
Es wäre am besten, wenn Git die -nFlagge nicht ignorieren würde, wenn sie --reversegegeben wird.
Frederick Nord
12
git log $(git log --pretty=format:%H|tail -1)
Matthew Flaschen
quelle
1
odergit log $(git log --reverse --pretty=format:%H|head -1)
Unpolarität
Hilfe für mich. echtes "erstes Commit"
Kangear
6

Nicht die schönste Art, es zu tun, denke ich:

git log --pretty=oneline | wc -l

Dies gibt Ihnen dann eine Nummer

git log HEAD~<The number minus one>
MHC
quelle
1

git log --format="%h" | tail -1gibt Ihnen den Commit-Hash (dh 0dd89fb), den Sie in andere Befehle einspeisen können, indem Sie so etwas tun

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD um alle Commits am letzten Tag anzuzeigen.

TankorSmash
quelle