Gibt es eine Möglichkeit festzustellen, wann ein Git-Zweig erstellt wurde? Ich habe einen Zweig in meinem Repo und ich erinnere mich nicht daran, ihn erstellt zu haben und dachte, dass der Zeitstempel der Erstellung mein Gedächtnis aufrütteln würde.
Gibt es eine Möglichkeit festzustellen, wann ein Git-Zweig erstellt wurde? Ich habe einen Zweig in meinem Repo und ich erinnere mich nicht daran, ihn erstellt zu haben und dachte, dass der Zeitstempel der Erstellung mein Gedächtnis aufrütteln würde.
Antworten:
Verwenden
git show --Zusammenfassung `git merge-base foo master`
Wenn Sie es lieber mit gitk im Kontext sehen möchten, verwenden Sie
gitk --all --select-commit = `git merge-base foo master`
(wobei foo der Name des gesuchten Zweigs ist.)
Wie in den Kommentaren und in Jackubs Antwort erwähnt , gc.reflogexpire
können Sie mithilfe Ihres Reflogs herausfinden, wann eine Zweigreferenz war , solange Ihr Zweig jünger ist als die in der Konfigurationseinstellung festgelegte Anzahl von Tagen (der Standardwert ist 90 Tage) zuerst erstellt.
Beachten Sie, dass git reflog
die meisten git log
Flags verwendet werden können. Beachten Sie außerdem, dass die HEAD@{0}
Stilselektoren effektiv Zeitvorstellungen sind und tatsächlich (auf gehackte Weise) als Datumszeichenfolgen behandelt werden. Dies bedeutet, dass Sie das Flag verwenden --date=local
und die folgende Ausgabe erhalten können:
$ git reflog --date = local 763008c HEAD @ {Fri Aug 20 10:09:18 2010}: Pull: Schnellvorlauf f6cec0a HEAD @ {Di Aug 10 09:37:55 2010}: Pull: Schnellvorlauf e9e70bc HEAD @ {Do 4. Februar 02:51:10 2010}: Pull: Schnellvorlauf 836f48c HEAD @ {Do 21 Jan 14:08:14 2010}: Kasse: Wechsel von Master zu Master 836f48c HEAD @ {Do 21 Jan 14:08:10 2010}: ziehen: Schnellvorlauf 24bc734 HEAD @ {Wed Jan 20 12:05:45 2010}: Kasse: Umzug von 74fca6a42863ffacaf7ba6f1936a9f228950f657 74fca6a HEAD @ {Wed Jan 20 11:55:43 2010}: Kasse: Übergang vom Master zu v2.6.31 24bc734 HEAD @ {Wed Jan 20 11:44:42 2010}: Pull: Schnellvorlauf 964fe08 HEAD @ {Mon Oct 26 15:29:29 2009}: Kasse: Umzug von 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 4a6908a HEAD @ {Mon Oct 26 14:52:12 2009}: Kasse: Übergang vom Master zu Version 2.6.28
Manchmal kann es auch nützlich sein, Folgendes zu verwenden --date=relative
:
$ git reflog --date = relative 763008c HEAD @ {vor 4 Wochen}: pull: Schnellvorlauf f6cec0a HEAD @ {vor 6 Wochen}: pull: Schnellvorlauf e9e70bc HEAD @ {vor 8 Monaten}: pull: Schneller Vorlauf 836f48c HEAD @ {vor 8 Monaten}: Kasse: Wechsel von Master zu Master 836f48c HEAD @ {vor 8 Monaten}: pull: Schneller Vorlauf 24bc734 HEAD @ {vor 8 Monaten}: Kasse: Umzug von 74fca6a42863ffacaf7ba6f1936a9f228950f657 zum Master 74fca6a HEAD @ {vor 8 Monaten}: checkout: Übergang vom Master zu v2.6.31 24bc734 HEAD @ {vor 8 Monaten}: pull: Schneller Vorlauf 964fe08 HEAD @ {vor 11 Monaten}: Kasse: Wechsel von 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 zum Master 4a6908a HEAD @ {vor 11 Monaten}: checkout: Übergang vom Master zu v2.6.28
Ein letzter Hinweis: Das --all
Flag (das eigentlich ein Git-Log-Flag ist, das von Git-Reflog verstanden wird) zeigt die Reflogs für alle bekannten Refs in refs/
(anstatt einfach HEAD
) an, wodurch Sie Verzweigungsereignisse klar anzeigen können :
git reflog --date = local --all 860e4e4 refs / Heads / Master @ {So Sep 19 23:00:30 2010}: Commit: Zweiter. 17695bc refs / Heads / example_branch @ {Mon Sep 20 00:31:06 2010}: branch: Erstellt von HEAD
gc.reflogexpire
weniger Tage.
Pro Git § 3.1 Git-Verzweigung - Was eine Verzweigung ist, enthält eine gute Erklärung dafür, was eine Git-Verzweigung wirklich ist
Ein Zweig in Git ist einfach ein leichter beweglicher Zeiger auf [a] Commit.
Da ein Zweig nur ein leichter Zeiger ist, hat git keine explizite Vorstellung von seinem Verlauf oder Erstellungsdatum. "Aber Moment mal", höre ich Sie sagen, "natürlich kennt git meine Branchengeschichte!" Naja, so ungefähr.
Wenn Sie eine der folgenden Aktionen ausführen:
git log <branch> --not master
gitk <branch> --not master
Sie werden sehen, wie die "Geschichte Ihres Zweigs" aussieht, aber es handelt sich tatsächlich um eine Liste von Commits, die über "Zweig" erreichbar sind und vom Master nicht erreichbar sind. Dies gibt Ihnen die gewünschten Informationen, aber genau dann, wenn Sie "Zweig" nie wieder mit dem Master zusammengeführt haben und den Master seit dem Erstellen noch nie mit "Zweig" zusammengeführt haben. Wenn Sie zusammengeführt haben , wird diese Geschichte der Unterschiede zusammenbrechen.
Glücklicherweise enthält das Reflog häufig die gewünschten Informationen, wie in verschiedenen anderen Antworten hier erläutert. Benutze das:
git reflog --date=local <branch>
um die Geschichte der Branche zu zeigen. Der letzte Eintrag in dieser Liste ist (wahrscheinlich) der Punkt, an dem Sie den Zweig erstellt haben.
Wenn der Zweig gelöscht wurde, ist 'Zweig' kein gültiger Git-Bezeichner mehr, aber Sie können diesen stattdessen verwenden, um zu finden, was Sie wollen:
git reflog --date=local | grep <branch>
Oder in einer Windows-Cmd-Shell:
git reflog --date=local | find "<branch>"
Beachten Sie, dass Reflog in Remote-Zweigen nicht effektiv funktioniert, sondern nur in solchen, an denen Sie lokal gearbeitet haben.
gc.reflogexpire
Tage ist, wie in dieser Antwort und dieser Antwort ausgeführt .
git reflog --date=local <branch>
Erstens, wenn Ihre Verzweigung innerhalb von gc.reflogexpire
Tagen erstellt wurde (Standard 90 Tage, dh ungefähr 3 Monate), können Sie den ersten Eintrag im Reflog verwenden git log -g <branch>
oder git reflog show <branch>
suchen, der ein Erstellungsereignis wäre und ungefähr wie folgt aussieht (für git log -g
):
Reflog: <branch>@{<nn>} (C R Eator <creator@example.com>)
Reflog message: branch: Created from <some other branch>
Sie würden erfahren, wer vor wie vielen Vorgängen einen Zweig erstellt hat und von welchem Zweig (nun, es könnte nur "Aus HEAD erstellt" sein, was nicht viel hilft).
Das hat MikeSep in seiner Antwort gesagt .
Zweitens müssten Sie , wenn Sie einen Zweig haben, der länger als gc.reflogexpire
läuft und ausgeführt wurde git gc
(oder der automatisch ausgeführt wurde), einen gemeinsamen Vorfahren mit dem Zweig finden, aus dem er erstellt wurde. Schauen Sie sich die Konfigurationsdatei an, vielleicht gibt es einen branch.<branchname>.merge
Eintrag, der Ihnen sagt, auf welchem Zweig dieser basiert.
Wenn Sie beispielsweise wissen, dass der betreffende Zweig außerhalb des Hauptzweigs erstellt wurde (Verzweigung vom Hauptzweig), können Sie den folgenden Befehl verwenden, um den gemeinsamen Vorfahren anzuzeigen:
git show $(git merge-base <branch> master)
git show-branch <branch> master
Alternativ können Sie es auch versuchen .
Ich bin mir des git-Befehls noch nicht sicher, aber ich denke, Sie können sie in den Reflogs finden.
.git/logs/refs/heads/<yourbranch>
Meine Dateien scheinen einen Unix-Zeitstempel zu haben.
Update: Es scheint eine Option zu geben, beim Drucken der Protokolle den Reflog-Verlauf anstelle des Commit-Verlaufs zu verwenden:
git log -g
Sie können diesem Protokoll auch bis zu dem Zeitpunkt folgen, an dem Sie den Zweig erstellt haben. git log
zeigt jedoch das Datum des Commits an, nicht das Datum, an dem Sie die Aktion ausgeführt haben, die einen Eintrag im Reflog vorgenommen hat. Ich habe das noch nicht gefunden, außer indem ich mir das aktuelle Reflog im obigen Pfad angesehen habe.
Versuche dies
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
%
vor(refname)
| cut -c 5- | sort -r |
und dann für den Monat durch grep und gab mir mehr oder weniger eine Liste in umgekehrter chronologischer Reihenfolge.
--sort='-committerdate'
(beachten Sie das '-' vor dem Committerdate für die umgekehrte chronologische Reihenfolge).
Verwenden:
git reflog
um den gesamten Lebenszyklus Ihres Repositorys im aktuellen Ordner anzuzeigen. Der zuerst angezeigte Filialname (von unten nach oben) ist die Quelle, die erstellt wurde.
855a3ce HEAD@{0}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{1}: checkout: moving from feature-sut-46 to development
855a3ce HEAD@{2}: checkout: moving from feature-jira35 to feature-sut-46
535dd9d HEAD@{3}: checkout: moving from feature-sut-46 to feature-jira35
855a3ce HEAD@{4}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{5}: checkout: moving from feature-jira35 to development
535dd9d HEAD@{6}: commit: insert the format for vendor specific brower - screen.css
855a3ce HEAD@{7}: checkout: moving from development to feature-jira35
855a3ce HEAD@{8}: checkout: moving from master to development
Das heißt:
Die Filialentwicklung wird vom Master aus erstellt (Kasse -b)
Die Zweigstelle feature-jira35 wird aus der Entwicklung erstellt (Kasse -b)
Das Zweig-Feature-jira-sut-46 wird aus der Entwicklung erstellt (Kasse -b)
Dies ist etwas, das ich mir ausgedacht habe, bevor ich diesen Thread gefunden habe.
git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1
git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:'
Dieser Befehl zeigt das Erstellungsdatum der Verzweigung dev
vonmain
$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
Wenn Sie die Details für alle Filialen erhalten möchten
for i in `git branch -r | tail -n +2 `;do git log --reverse $i|grep -A 2 -B 2 `echo $i | awk -F'origin/' '{print $2}'` |head -n 4; done
Ich habe den besten Weg gefunden: Ich überprüfe immer den neuesten Zweig, der auf diese Weise erstellt wurde
git for-each-ref --sort=-committerdate refs/heads/
Kombiniert mit der Antwort von Andrew Sohn ( https://stackoverflow.com/a/14265207/1929406 )
branchcreated=$(git reflog show --date=format:'%Y-%m-%d %H:%M:%S' --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1| cut -d'{' -f 2| cut -d'}' -f 1 | xargs)
echo $branchcreated
Das hat es für mich getan: (10 Jahre später)
git log [--remotes] --no-walk --decorate
Da zu den Erstellungszeiten der Zweige keine gespeicherten Informationen vorhanden sind, wird das erste Festschreiben jedes Zweigs ( --no-walk
) angezeigt , einschließlich des Datums des Festschreibens. Verwenden Sie diese Option --remotes
für die Remote-Zweige oder lassen Sie sie für lokale Zweige weg.
Da ich mindestens ein Commit in einem Zweig durchführe, bevor ich einen anderen erstelle, konnte ich einige Monate der Zweigerstellung (und des Feature-Dev-Starts) zu Dokumentationszwecken zurückverfolgen.
Quelle: AnoE beim Stapelaustausch