Wie kann ich alle Commits für einen bestimmten Tag anzeigen?


186

Ich habe mir bereits die relevanten Dokumente von git-scm.com und gitref.org angesehen , aber ich kann das anscheinend nicht herausfinden.

Angenommen, ich möchte alle Commits für Dienstag, den 12. November 2013, erhalten. Am Beispiel eines vorhandenen Repos weiß ich, dass ich an diesem Tag Commits habe und am Tag zuvor und am Tag danach Commits.

Mit 2013-11-11 und2013-11-12

Alle folgenden geben mir Verpflichtungen für den 11. und 12. November:

  • git log --after="2013-11-11" --until="2013-11-12"
  • git log --since="2013-11-11" --until="2013-11-12"
  • git log --after="2013-11-11" --before="2013-11-12"
  • git log --since="2013-11-11" --before="2013-11-12"

Mit 2013-11-12 nur

Alle folgenden geben mir keine Verpflichtungen:

  • git log --since="2013-11-12" --until="2013-11-12"
  • git log --since="2013-11-12" --before="2013-11-12"
  • git log --after="2013-11-12" --until="2013-11-12"
  • git log --after="2013-11-12" --before="2013-11-12"

Mit 2013-11-12 und2013-11-13

Wie erwartet (aus den Ergebnissen von 2013-11-11und 2013-11-12oben) geben mir alle folgenden Ergebnisse sowohl vom 12. als auch vom 13. November:

  • git log --since="2013-11-12" --before="2013-11-13"
  • git log --after="2013-11-12" --before="2013-11-13"
  • git log --since="2013-11-12" --until="2013-11-13"
  • git log --after="2013-11-12" --before="2013-11-13"

...und so weiter und so fort. Ich fühle mich wie ich jede mögliche Kombination von versucht haben since, after, before, und , untilaber immer noch keine Antwort finden kann, noch kann ich verstehen , ob diese Optionen sind inklusive oder exklusive, da sie umfassend zu sein scheinen , wenn die beiden Daten unterschiedlich sind, aber exklusiv, wenn sie am selben Tag sind. Habe ich etwas verpasst / was mache ich falsch?!


8
Ich habe Git's seit / nach / bis / vor dem Umgang selbst sehr seltsam gefunden, daher kenne ich die Antwort nicht, aber Sie haben versucht, Datum + Uhrzeit anzugeben (z. B. --since = "2013-11-12 00:00 ")? Haben (einige) Ihrer Commits unterschiedliche Committer- oder Autorendaten?
John Bartholomew

Du hast es! Angabe der Arbeitszeit. Es kam mir nicht einmal in den Sinn, es mit der Zeit zu versuchen. Vielen Dank! In Bezug auf Committer- und Autorendaten wurden während dieser Daten keine Patches angewendet, das war es also nicht.
3cheesewheel

Mir scheint, dass 'git log --boundary' dies für Sie tun sollte, damit 'git log --boundary --after = "2013-11-12" --before = "2013-11-12"' angezeigt wird genau ein Commit (das, von dem du denkst, dass es es tun würde :)).
Qneill

Antworten:


229

Danke John Bartholomew!

Die Antwort besteht darin, die Zeit anzugeben, z git log --after="2013-11-12 00:00" --before="2013-11-12 23:59"


12
Nett. Dieser Befehl lässt jedoch Commits zwischen 23:59 und 00:00 am nächsten Tag aus und ist daher git log --after="2013-11-12 00:00" --before="2013-11-13 00:00"besser. Ich glaube, gitk --since="2013-11-12 00:00" --until="2013-11-13 00:00" &würde auch funktionieren, wenn Sie gitk installiert haben.
HelloGoodbye

6
In git 2.13.0. git log --after="2017-07-25" --before="2017-07-26"gibt gültige Ergebnisse für mich.
Powlo

1
Ist dies für den aktuell ausgecheckten Zweig? Wie kann man über alle Branchen hinweg sehen?
Nawfal

Dies ist die richtige Antwort, aber ich bin immer noch verblüfft und habe diese Folgefrage gestellt: stackoverflow.com/questions/59691065/…
bgoodr

28

Normalerweise überprüfe ich mein Git-Protokoll und sehe, was ich an einem bestimmten Tag gearbeitet habe, und aktualisiere meine Arbeitszeittabelle darauf basierend, aber es ist eine Qual, das vollständige Datum im ISO-Format einzugeben, also mache ich es einfach so

git log --after=jun9 --before=jun10

und ich füge hinzu, --authorum nur meine Commits zu drucken

git log --since=jun9 --until=jun10 --author=Robert 

Hiermit werden Commits gedruckt, die am letzten 9. Juni stattgefunden haben (in diesem Fall also für 2016 und nicht für 2015 oder 2014 usw.).

Die --since/--afterund --until/--beforeParameter können auch Sachen nehmen wie 3 days ago, yesterdayetc.


Funktioniert einfach nicht, gibt nichts aus. Vermisse ich etwas Soll ich einen Zweig angeben?
Aurimas

1
@ Aurimas Nun, ich bin mir nicht sicher, was an deinem Ende schief gelaufen ist. Wenn Ihre sinceund untilWerte nicht korrekt sind, erhalten Sie keine Ausgabe, die sicher ist. Verwenden Sie git logzuerst, und versuchen , ein wählen sinceund untilWert auf das, was Sie sehen. Keine Filiale oder etwas Besonderes erforderlich. Ich bin mir nicht sicher, seit welcher Git-Version diese Funktion verfügbar ist. Stellen Sie sicher, dass Sie auch eine aktuelle Version haben.
Kohányi Róbert

6
Ich musste Leerzeichen verwenden:git log --after="may 2" --before="may 3"
Connor Clark

15

An der akzeptierten Antwort (die ich positiv bewertet habe) ist nichts auszusetzen, aber ... wir sind hier für die Wissenschaft!

Die folgende Ausgabe kann mit pretty=format:<string> Platzhaltern erweitert / angepasst werden :

git log --pretty='format:%H %an %ae %ai' | grep 2013-11-12

Nicht 100% immun gegen Fehler, da ein Benutzer dieselbe Zeichenfolge hätte eingeben können. Aber akzeptabel, je nachdem welche Platzhalter verwendet werden. Das obige Snippet würde zum Beispiel nicht fehlschlagen.

Man könnte auch analysieren , einfach das ganze git logauf JSONund verbrauchen / manipulieren ihre Daten an das Herz Inhalt. Überprüfen Sie https://github.com/dreamyguy/gitlogg und schauen Sie niemals zurück!

Haftungsausschluss: Das ist eines meiner Projekte.


10

Ich habe einen Git-Alias für diesen speziellen Zweck erstellt:

commitsAtDate = "!f() { git log --pretty='format:%C(yellow)%h %G? %ad%Cred%d %Creset%s%C(cyan) [%cn]' --decorate --after=\"$1 0:00\" --before=\"$1 23:59\" --author \"`git config user.name`\"; }; f"

Verwendung:

git commitsAtDate 2017-08-18

1
Sie können auch relative Daten zu diesem Alias, dh angeben git commitsAtDate yesterday, 2 days agousw.
voiger

-2

Dieses Skript zeigt den verfügbaren Datumsbereich der Commits für das aktuelle Repo an und fordert dann zur Eingabe des Datums auf, ab dem Commits angezeigt werden sollen. Es zeigt eine kurze SHA und die vollständige SHA, den Autor, den Festschreibungszeitstempel und die Kommentare in einfachen Anführungszeichen an.

Das Skript fordert so lange zur Eingabe von Daten auf, bis Sie die Eingabetaste oder Strg-D drücken.

Mac-Benutzer: Benötigt Gnu-Datum.

#!/bin/bash

COMMITS=`git log --abbrev-commit --pretty="format:%h %H %ai" | sort -k3 -k4`
FIRST=`echo "$COMMITS" | head -n 1`
LAST=`echo "$COMMITS" | tail -n 1`
echo "First commit: $FIRST"
echo "Last commit: $LAST"
printf "Date to search for commits: "
read DATE
while [[ "$DATE" ]]; do
  NEXT_DATE=`date +%Y-%m-%d -d "$DATE +1 day"`
  #echo "Searching for commits from $DATE to $NEXT_DATE"
  echo `git log --after="$DATE" --before="$NEXT_DATE" --pretty="format:%h %H %an %ci '%s'"`
  printf "\nDate to search for commits: "
  read DATE
done

Ich habe das Skript aufgerufen commitsOnDatesund hier ist es in Aktion. Das erste Datum, das ich eingebe, hat keine Commits, daher ist die Antwort nur eine leere Zeile:

$ commitsOnDates
First commit: 375bcfb 375bcfbbf548134a4e34c36e3f28d87c53b2445f 2015-08-03 13:37:16 -0700
Last commit: 1d4c88c 1d4c88ce6a15efaceda1d653eed3346fcae8f5e6 2018-10-13 21:32:27 -0700
Date to search for commits: 2015-08-13


Date to search for commits: 2015-08-03
375bcfb 375bcfbbf548134a4e34c36e3f28d87c53b2445f Mike Slinn 2015-08-03 13:37:16 -0700 'this is a comment'

Date to search for commits: 2018-10-13
1d4c88c 1d4c88ce6a15efaceda1d653eed3346fcae8f5e6 Mike Slinn 2018-10-13 21:32:27 -0700 'a comment' 64d6e16 64d6e16338657b82c91ac94bea8ebf7b80dc4c28 Mike Slinn 2018-10-13 18:28:41 -0700 'nother comment' d5eb26e d5eb26e49fc9dceee9b9f5a2d8fa052bff2cfbbc Mike Slinn 2018-10-13 18:16:20 -0700 'no comment' d8a4992 d8a4992df208ba5efb50728311820bdad5ba5332 Mike Slinn 2018-10-13 12:02:00 -0700 'commented'

Date to search for commits:
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.