Come posso visualizzare tutti i commit per un giorno specifico?


188

Ho già esaminato i documenti pertinenti di git-scm.com e gitref.org , ma non riesco a capirlo.

Diciamo che voglio ottenere tutti gli commit per martedì 12 novembre 2013. Usando un repository esistente come esempio, so per certo che ho commesso quel giorno, così come il giorno prima e il giorno successivo.

Con 2013-11-11e2013-11-12

Tutto ciò che segue mi dà impegni sia per l'11 che per il 12 novembre:

  • 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"

Con 2013-11-12solo

Tutto ciò che segue non mi dà alcun impegno:

  • 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"

Con 2013-11-12e2013-11-13

Come previsto (dai risultati di 2013-11-11e 2013-11-12sopra), tutto quanto segue mi dà risultati sia dal 12 al 13 novembre:

  • 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"

...E così via e così via. Mi sento come ho provato ogni possibile combinazione di since, after, before, e until, ma ancora non riesce a trovare la risposta, e non capisco se queste opzioni sono comprensivi o esclusivo, dal momento che sembrano essere compreso se sono diverse le due date, ma esclusivo se sono nello stesso giorno. Mi sono perso qualcosa / cosa sto facendo di sbagliato ?!


8
Ho trovato git dal / dopo / fino / prima di gestire me stesso molto strano, quindi non conosco la risposta, ma hai provato a specificare data + ora (ad esempio, --since = "2013-11-12 00:00 ")? Inoltre, (qualcuno dei) tuoi commit ha date di committer diverse rispetto all'autore?
John Bartholomew,

Avete capito bene! Specifica del tempo impiegato. Non mi è nemmeno venuto in mente di provarlo con un po 'di tempo. Grazie! Per quanto riguarda le date tra committer e autore - non c'erano patch applicate durante quelle date, quindi non è vero.
3cheesewheel

Mi sembra che 'git log --boundary' dovrebbe fare questo per te, quindi che 'git log --boundary --after = "2013-11-12" --before = "2013-11-12"' mostrerebbe esattamente un commit (quello che pensi che sarebbe :)).
qneill,

Risposte:


231

Grazie John Bartolomeo!

La risposta è specificare l'ora, ad es git log --after="2013-11-12 00:00" --before="2013-11-12 23:59"


12
Bello. Tuttavia, quel comando ometterà i commit tra le 23:59 e le 00:00 del giorno successivo, quindi git log --after="2013-11-12 00:00" --before="2013-11-13 00:00"è meglio. Credo gitk --since="2013-11-12 00:00" --until="2013-11-13 00:00" &che funzionerebbe anche se hai installato Gitk.
Ciao Arrivederci

6
In git 2.13.0. git log --after="2017-07-25" --before="2017-07-26"dà risultati validi per me.
Powlo,

1
È per il ramo attualmente estratto? Come vedere attraverso tutti i rami?
nawfal,

Questa è la risposta corretta, ma sto ancora sconcertato da essa e postato questa domanda di follow-up: stackoverflow.com/questions/59691065/...
bgoodr

28

Di solito controllo il mio registro git e vedo cosa stavo lavorando in un giorno specifico e aggiorno la mia scheda attività in base a quello, ma è una seccatura nel culo digitare la data completa in formato ISO, quindi lo faccio così

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

e aggiungo --authorper stampare solo i miei commit

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

Questa stampa impegna ciò che è accaduto lo scorso 9 giugno (quindi per il 2016 in questo caso e non per il 2015 o 2014 e così via).

I --since/--afterei --until/--beforeparametri possono anche prendere roba come 3 days ago, yesterdayecc


Semplicemente non funziona, non genera nulla. Mi sto perdendo qualcosa? Devo specificare un ramo?
Aurimas,

1
@Aurimas Beh, non sono sicuro di cosa sia andato storto. Se i tuoi valori sincee untilnon sono corretti non otterrai alcun risultato, questo è certo. Utilizzare git logprima, e cercare di scegliere un sincee untilil valore in base a ciò che si vede. Nessuna filiale o qualcosa di speciale richiesto. Non sono sicuro da quale versione Git questa funzione è disponibile. Assicurati di avere anche una versione recente.
Kohányi Róbert,

6
Ho dovuto usare gli spazi:git log --after="may 2" --before="may 3"
Connor Clark

16

Niente di sbagliato nella risposta accettata (che ho votato a favore), ma ... siamo qui per la scienza!

L'output di seguito può essere espanso / personalizzato con pretty=format:<string> segnaposto :

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

Non immune al 100% da errori in quanto la stessa stringa avrebbe potuto essere inserita da un utente. Ma accettabile a seconda di quali segnaposto vengono utilizzati. Lo snippet sopra non fallirebbe, per esempio.

Si potrebbe anche semplicemente analizzare il tutto git logper JSONe consumare / manipolare i propri dati al proprio contenuto di cuore. Controllare https://github.com/dreamyguy/gitlogg out e mai guardare indietro!

Disclaimer: questo è uno dei miei progetti.


10

Ho creato un alias git per quello scopo specifico:

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"

Uso:

git commitsAtDate 2017-08-18

1
è anche possibile specificare date relative a questo alias, vale a dire git commitsAtDate yesterday, 2 days agoe così via
voiger

-2

Questo script visualizza l'intervallo di date disponibile di commit per il repository corrente, quindi richiede la data da cui si desidera vedere i commit. Mostra un breve SHA e l'intero SHA, l'autore, il timestamp di commit e i commenti tra virgolette singole.

Lo script continua a richiedere le date fino a quando non premi Invio o Control-D.

Utenti Mac: richiede data gnu.

#!/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

Ho chiamato la sceneggiatura commitsOnDatese qui è in azione. La prima data che inserisco non ha alcun commit, quindi la risposta è solo una riga vuota:

$ 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:
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.