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:
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,
git log -1
.Antworten:
Kurze Antwort
(Aus Tihos Kommentar . Wie Chris Johnsen bemerkt ,
--max-parents
wurde 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.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 dase83c516
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 (inbar.git
), jedoch nicht so lange libfoo (das Commit mit dem frühesten Datum inlibfoo.git
hat ein Datum, das dem Commit mit dem frühesten Datum in vorausgehtbar.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 bestimmenbar.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:
Wenn dies
--max-parents
nicht verfügbar ist, funktioniert dies auch:Wenn Sie nützliche Tags eingerichtet haben, erhalten Sie
git name-rev
möglicherweise einen schnellen Überblick über den Verlauf:Bonus
Oft benutzen? Schwer zu merken? Fügen Sie einen Git-Alias für den schnellen Zugriff hinzu
Jetzt können Sie einfach tun
quelle
git rev-list --max-parents=0 HEAD
wird das Gleiche tun und ist ein bisschen einfacher.Ich habe das gefunden:
zeigt Commits von Anfang an.
quelle
git log --reverse -5
lässt es das--reverse
aus irgendeinem Grund ignorierenSie können Ihr Protokoll einfach umkehren und das erste Ergebnis anzeigen.
quelle
git log --reverse
kehrt den Verlauf um, sodass Siehead -1
statt verwenden müssentail -1
, um das erste Commit zu erhalten.-n
Flagge nicht ignorieren würde, wenn sie--reverse
gegeben wird.quelle
git log $(git log --reverse --pretty=format:%H|head -1)
Nicht die schönste Art, es zu tun, denke ich:
Dies gibt Ihnen dann eine Nummer
quelle
git log --format="%h" | tail -1
gibt Ihnen den Commit-Hash (dh0dd89fb
), den Sie in andere Befehle einspeisen können, indem Sie so etwas tungit diff `git log --format="%h" --after="1 day"| tail -1`..HEAD
um alle Commits am letzten Tag anzuzeigen.quelle