Ich habe ein Projekt, das eine lange Geschichte hat. Ich möchte das erste Commit für Git zeigen.
Wie mache ich das?
Ich habe ein Projekt, das eine lange Geschichte hat. Ich möchte das erste Commit für Git zeigen.
Wie mache ich das?
Antworten:
git rev-list --max-parents=0 HEAD
(Aus Tihos Kommentar . Wie Chris Johnsen bemerkt , --max-parents
wurde er eingeführt, nachdem diese Antwort veröffentlicht wurde.)
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.git
Repository 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 e83c516
ist, 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.git
hat 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-parents
nicht 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-rev
möglicherweise einen schnellen Überblick über den Verlauf:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin
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
git rev-list --max-parents=0 HEAD
wird das Gleiche tun und ist ein bisschen einfacher.
Ich habe das gefunden:
git log --reverse
zeigt Commits von Anfang an.
git log --reverse -5
lässt es das --reverse
aus irgendeinem Grund ignorieren
Sie können Ihr Protokoll einfach umkehren und das erste Ergebnis anzeigen.
git log --pretty=oneline --reverse | head -1
git log --reverse
kehrt den Verlauf um, sodass Sie head -1
statt verwenden müssen tail -1
, um das erste Commit zu erhalten.
-n
Flagge nicht ignorieren würde, wenn sie --reverse
gegeben wird.
git log $(git log --pretty=format:%H|tail -1)
git log $(git log --reverse --pretty=format:%H|head -1)
git log --format="%h" | tail -1
gibt 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.
git log -1
.