Oder nur alle Commits, die zwischen zwei Daten stattgefunden haben? In SVN können Sie so etwas tun
svn diff -r{date}:{date}
es zu tun! Ich kann anscheinend kein Git-Äquivalent dazu finden.
Insbesondere möchte ich ein Skript schreiben, um täglich E-Mails mit dem gesamten Code zu versenden, der an diesem Tag festgeschrieben wurde, und von wem.
The command is kept primarily for historical reasons; fingers of many people who learned Git long before git log was invented by reading Linux kernel mailing list are trained to type it.
Also, die Dokumentation empfiehlt die Verwendunggit log
anstelle vongit whatchanged
; Dieser letzte Befehl verwendet auch die Option --no-merge des Git-Protokolls, sodass dieselben Ergebnisse ausgegeben werden.git whatchanged
ist ab der aktuellsten Version 2.21.0 veraltet. Allesgit whatchanged
Erreichte kann erreicht werdengit log
und ist nur aus historischen Gründen erhalten. Siehe Details git-scm.com/docs/git-whatchanged/2.21.0Die vorherigen Vorschläge haben einige Nachteile. Grundsätzlich suchte ich etwas Äquivalentes zu
cvs diff -D"1 day ago" -D"2010-02-29 11:11"
. Während ich immer mehr Informationen sammelte, fand ich eine Lösung.Dinge, die ich versucht habe:
git whatchanged --since="1 day ago" -p
von hierDies ergibt jedoch einen Unterschied für jedes Commit, selbst wenn eine Datei mehrere Commits enthält. Ich weiß, dass "Date" in Git ein etwas lockeres Konzept ist. Ich dachte, es muss einen Weg geben, dies zu tun.
git diff 'master@{1 day ago}..master
gibt eine Warnungwarning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100.
und zeigt nicht alle Unterschiede.git format-patch --since=yesterday --stdout
gibt nichts für mich.revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1)
funktioniert irgendwie, scheint aber kompliziert und beschränkt sich nicht auf den aktuellen Zweig.Schließlich:
git diff $(git rev-list -n1 --before="1 day ago" master)
scheint zu funktionieren und eine Standardmethode, um ähnliche Dinge zu tun , obwohl komplizierter als ich dachte.Lustigerweise unterstützt git-cvsserver "cvs diff -D" nicht (ohne dass es irgendwo dokumentiert ist).
quelle
git rev-list
, was einen großen Beitrag zur Lösung des sehr ähnlichen Problems geleistet hat, das ich gesehen habe.git diff 'master@{1 day ago}..master
Syntax bedeutet „überprüfen die reflog und herauszufinden , wo Zweigmaster
zu Punkt verwendet in Ihrem lokalen Repository1 day ago
“. Insbesondere wird der tatsächliche Festschreibungsverlauf des aktuellen Zweigs nicht verwendetmaster
. Dies ist sehr selten das, was Sie wirklich wollen."date" ist ein bisschen ein loses Konzept in git. Ein Commit hat ein Autorendatum, das möglicherweise einige Zeit in der Vergangenheit liegt, bevor jemand das Commit tatsächlich in sein Repository zieht / festschreibt. Außerdem kann das Commit neu basiert und aktualisiert werden, um über einem anscheinend neueren Commit zu liegen.
Ein Commit hat auch ein Commit-Datum, das aktualisiert wird, wenn ein Commit in irgendeiner Weise neu basiert oder geändert wird. Es ist wahrscheinlicher, dass diese Commits in einer chronologischen Reihenfolge vorliegen, aber Sie sind immer noch dem Committer ausgeliefert, der die richtige Zeit auf seinem Computer eingestellt hat. Trotzdem kann ein unverändertes Commit auf unbestimmte Zeit in einem Feature-Zweig in einem Remote-Repository gespeichert werden wird in den Hauptzweig eines zentralen Repositorys zusammengeführt.
Was für Ihre Zwecke wahrscheinlich am nützlichsten ist, ist das Reflog-Datum für das betreffende Repository. Wenn Sie Reflogs pro Zweig aktiviert haben (siehe
git config core.logAllRefUpdates
), können Sie mithilfe derref@{date}
Syntax angeben , wo sich ein Zweig zu einem bestimmten Zeitpunkt befand.Z.B
Sie können auch 'Fuzzy'-Beschreibungen verwenden wie:
Diese Befehle zeigen alle Commits an, die in dem angegebenen Zweig des Repositorys "erschienen" sind, unabhängig davon, wie "alt" sie tatsächlich sind, je nach Autor und Commit-Datum.
Beachten Sie, dass das Reflog pro Zweig für ein Repository spezifisch ist. Wenn Sie also den Protokollbefehl auf einem Klon ausführen und nicht (sagen wir) einen Monat lang abrufen, ziehen Sie alle Änderungen für den letzten Monat auf einmal ab. Dann werden alle Änderungen des letzten Monats in einem
@{1 hour ago}..@{now}
Bereich angezeigt. Wenn Sie den Befehl log für das 'zentrale' Repostory ausführen können, auf das die Benutzer zugreifen, kann er das tun, was Sie möchten.quelle
@{time spec}
Syntax immer auf Ihr lokales Reflog verweist . Es bezieht sich nicht auf den tatsächlichen Commit-Verlauf (DAG). Wenn Sie den Unterschied nicht verstehen, verwenden Sie diese Syntax nicht!oder
quelle
@{time spec}
Syntax immer auf Ihr lokales Reflog verweist . Es bezieht sich nicht auf den tatsächlichen Commit-Verlauf (DAG). Wenn Sie den Unterschied nicht verstehen, verwenden Sie diese Syntax nicht!Vielleicht
ist was du willst (mit oder ohne '--stdout')?
quelle
Ich glaube, die allgemeine Lösung besteht darin, Folgendes zu verwenden:
Ohne --first-parent erhalten Sie möglicherweise ein Commit von einem Zweig, der später zusammengeführt wurde,
a ref
aber noch nicht zusammengeführt wurdea date string
.Hier ist eine Alternative mit
--children
undgrep
anstelle von-n1
:Ich war
git whatchanged
vor dem Lesen dieser Fragen und Antworten nicht damit vertraut , aber es gibt sehr unterschiedliche Ergebnisse für mich, daher bin ich mir nicht sicher, was es tut.quelle
Eine andere einfache Möglichkeit, einen Unterschied aller Änderungen seit einem bestimmten Datum zu erhalten, besteht darin, einfach das erste Commit zu finden,
X
das an oder nach diesem Datum stattgefunden hat, und es dann zu verwendenDies hat den Vorteil, dass es im Gegensatz zum nicht zu Reflog-Einträgen in einem neuen Klon kommt
Lösungen in
quelle
Dies ist eher eine lustige Antwort, weil es wahrscheinlich einen besseren Weg gibt. Dies zeigt alle Commit-Hashes für heute.
; ·)
quelle
Sie können auch den Git-Format-Patch verwenden , um Patches (Diffs) vorzubereiten und per E-Mail zu senden.
Verwenden Sie die Optionen [seit] oder [Revisionsbereich], um den Festschreibungsbereich anzugeben.
quelle
Verwenden Sie die folgende Formel, um zu sehen, wie sich Git-Dateien in Ihrem Zweig von Datum zu Datum ändern :
Formel :
Beachten Sie, dass die Daten im Format JJJJ-MM-TT vorliegen:
Wenn Sie Änderungen an einer bestimmten Datei in einem bestimmten Zeitraum beobachten möchten beobachten möchten (beobachten Sie den Unterschied im Code), navigieren Sie einfach in der aktuellen Datei:
Beispiel :
quelle
Ich werde die Art und Weise einwerfen, wie ich es mache:
git log
Für ein Datum erhalten Sie Hashes für den aktuellen Zweig. Dann benutze ich einfach so etwasgit diff 8fgdfg8..565k4l5
, was mir den richtigen Unterschied gibt, der nach Dateien aggregiert ist. Hoffe das hilft, aber nicht viel getestetquelle