Wie kann man feststellen, wann ein Git-Zweig erstellt wurde?

326

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.

paxos1977
quelle
3
fand dies sehr hilfreich commandlinefu.com/commands/view/2345/…
Brendon-Van-Heyzen
1
Wenn Sie diese Frage gestellt haben, waren Sie wirklich nur daran interessiert, das Datum und die Uhrzeit der Erstellung des Zweigs zu ermitteln, oder waren Sie auch daran interessiert zu wissen, wo in Ihrem Commit-Verlauf der Zweig zuerst erstellt wurde, dh welcher Commit Ihr Zweig zuerst verzweigt wurde von?
3
@ Cupcake, die Frage ist ziemlich klar. Ich war daran interessiert, als ich die Niederlassung gründete. Das heißt, das Commit zu kennen, wäre im allgemeinen Fall eine nützliche Information.
paxos1977

Antworten:

151

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.)

Bildschirmfoto

Greg Bacon
quelle
24
Um die Antwort zu klären, gibt es zwei Schritte. (1) Holen Sie sich den Baum mit "git merge-base <branch> master", wobei branch der Zweig von Interesse ist. (2) Verwenden Sie den Baum als Eingabe in git show, um das Datum zu erhalten: "git show --summary <treesh>"
paxos1977
11
Diese Antwort scheint zu sein, dass der Zweig vom Master erstellt wurde. Aber was ist, wenn dies nicht der Fall ist? Gibt es eine Möglichkeit, das erste Commit des Zweigs mit mehr als einem Kind zu finden?
Manitra Andriamitondra
20
Dies ist nicht das Datum, an dem die Verzweigung erstellt wurde - dies ist das "Verzweigungs" -Commit.
Marco
44
Die Lösung funktioniert nur, wenn 'branch' nie wieder mit 'master' zusammengeführt wurde. Gibt es eine Möglichkeit, die allererste Zusammenführungsbasis für zwei Zweige universell zu finden?
Ilya Ivanov
22
Dies zeigt die Zusammenführungsbasis, nicht die Erstellung von Zweigen.
Hedley
138

Wie in den Kommentaren und in Jackubs Antwort erwähnt , gc.reflogexpirekö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 reflogdie meisten git logFlags 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=localund 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 --allFlag (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
Aaron
quelle
3
Sehr interessant. +1. Vorausgesetzt natürlich, dies erfolgt innerhalb gc.reflogexpireweniger Tage.
VonC
2
@VonC - richtig du bist. Der Standardwert für gc.reflogexpire beträgt 90 Tage.
Aaron
1
Schließlich! Die einzige Antwort, in der Git selbst sagt: "Zweig: Erstellt aus KOPF". Damit das schwer fassbare "Zweig" -Ding von git bis zu seinem Erstellungsdatum und seiner Erstellungszeit aufgespürt werden kann ... Danke, +1 Auszeichnung. Aber was ist mit dieser Sache mit gc.reflogexpire und wie geht das auf entfernten Zweigen?
Motti Shneor
60

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.

yoyo
quelle
Hmm, ich bin mir noch nicht sicher, wie nützlich diese Antwort ist. Ich muss sie später genauer untersuchen. Für das, was es wert ist, haben Sie definitiv gute Arbeit geleistet, um etwas Umfassendes zu schreiben , und nicht nur eine kurze, faule Teilantwort, also ist das definitiv gut. Es ist auch wichtig zu beachten, dass Sie das Reflog nur verwenden können, solange Ihr Zweig nicht älter als gc.reflogexpireTage ist, wie in dieser Antwort und dieser Antwort ausgeführt .
4
Ich wollte nicht alle guten Informationen über Reflogs aus den anderen Antworten duplizieren, fügte aber gerne das gc.reflogexpire hinzu, wenn Sie es für nützlich halten. Meine Antwort sollte (1) mehr Klarheit darüber geben, was ein Git-Zweig ist und warum seine "Geschichte" etwas nebulös ist, (2) nützliche Befehle in den Mittelpunkt stellen, einschließlich (3) Anzeigen von Commits auf einem Zweig und nicht von Master und (4) Durchsuchen des Reflogs nach einem gelöschten Zweig. Feedback willkommen.
Jojo
Danke @Cupcake. Komischerweise hatte ich ursprünglich spitze Klammern um 'branch', aber das hat das gesamte Wort aus meiner Antwortvorschau entfernt, sodass ich davon ausgegangen bin, dass es fälschlicherweise als (ungültiges) Inline-HTML behandelt wurde.
Jojo
Diese Methode funktionierte gut über Intellij und git reflog --date=local <branch>
BitBucket
40

Erstens, wenn Ihre Verzweigung innerhalb von gc.reflogexpireTagen 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 <[email protected]>)
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.reflogexpirelä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>.mergeEintrag, 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> masterAlternativ können Sie es auch versuchen .

Dies sagte Gbacon in seiner Antwort .

Jakub Narębski
quelle
3
"git reflog show <branch>" funktioniert gut und zeigt sehr explizit an, wann der Zweig erstellt wurde. Treesh füttert "git show --summary <treesh>"
paxos1977
1
Das 'git log -g <branch>' hat für mich funktioniert - viele Details. Muss in der Filiale sein, um diese zu verwenden.
Lidia
18

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 logzeigt 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.

Mike Seplowitz
quelle
12

Versuche dies

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
Sireesh Yarlagadda
quelle
3
Sie können wahrscheinlich %vor(refname)
Vor
1
@Vor ich nahm die Änderung
biniam
Ich leitete dies durch | 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.
Noumenon
2
@Noumenon: for-each-ref kann für Sie sortieren, indem Sie z. B. hinzufügen --sort='-committerdate'(beachten Sie das '-' vor dem Committerdate für die umgekehrte chronologische Reihenfolge).
Pete
9

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)

De Nguyen
quelle
2
aber wo sind die Daten? und Sie sehen mehrmals das Auschecken in jeder Filiale. Bedeutet dies, dass nur das ERSTE Vorkommen jedes Zweigs seine Entstehung ist?
Motti Shneor
4

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:'
Andrew Sohn
quelle
3

Dieser Befehl zeigt das Erstellungsdatum der Verzweigung devvonmain

$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
Sazzad Hissain Khan
quelle
"das Erstellungsdatum der Verzweigung" ... wenn weniger als 90 Tage. Wenn es länger als 90 Tage erstellt wurde, werden diese Informationen gelöscht. Wie oben unter stackoverflow.com/a/3748722/6309 erwähnt .
VonC
@Sazzad Hissain Khan Dieser hat für uns funktioniert, da wir einigen nicht-technischen Leuten, die sich mit einigen der Feinheiten von Git ein wenig verlaufen haben, 'freundliche Spickzettel-Tipps' geben wollten.
Chris22
2

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
Anshul Agarwal
quelle
2

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/
user838900
quelle
1

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
kivagant
quelle
1

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 --remotesfü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

Groo der Käferjäger
quelle
0

Syntax: git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1

Beispiel: git reflog --date=local | grep checkout: | grep dev-2.19.0 | tail -1

Ergebnis: cc7a3a8ec HEAD@{Wed Apr 29 14:58:50 2020}: checkout: moving from dev-2.18.0 to dev-2.19.0

Jamter
quelle