Como visualizo todas as confirmações para um dia específico?

188

Eu já examinei os documentos relevantes de git-scm.com e gitref.org , mas não consigo entender isso.

Digamos que eu quero obter todas as confirmações para terça-feira, 12 de novembro de 2013. Usando um repositório existente como exemplo, sei que tenho confirmações nesse dia e confirma no dia anterior e no dia seguinte.

Com 2013-11-11e2013-11-12

Todos os itens a seguir me confirmam nos dias 11 e 12 de novembro:

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

Com 2013-11-12apenas

Todos os itens a seguir não me comprometem:

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

Com 2013-11-12e2013-11-13

Como esperado (a partir dos resultados de 2013-11-11e 2013-11-12acima), todos os itens a seguir fornecem resultados de 12 e 13 de novembro:

  • 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 assim por diante. Eu sinto que eu tentei todas as combinações possíveis de since, after, beforee, untilmas ainda não pode encontrar a resposta, nem eu entender se essas opções são inclusivas ou exclusivas, desde que parecem ser inclusiva se as duas datas são diferentes, mas exclusivo se estiver no mesmo dia. Perdi alguma coisa / o que estou fazendo de errado ?!

3cheesewheel
fonte
8
Eu achei o git desde / depois / até / antes de me tratar muito estranho, então não sei a resposta, mas você tentou especificar data e hora (por exemplo, --since = "2013-11-12 00:00 ")? Além disso, (algum dos) seus commits têm datas de committer e autor diferentes?
John Bartholomew
Você entendeu! Especificando o tempo trabalhado. Nem me ocorreu tentar com um tempo. Obrigado! Quanto às datas do autor e do autor - não houve patches aplicados durante essas datas, portanto não foi.
3cheesewheel
Parece-me que 'git log --boundary' deve fazer isso por você, para que 'git log --boundary --after = "2013-11-12" --before = "2013-11-12"' seja exibido exatamente um commit (o que você acha que seria :)).
qneill

Respostas:

231

Obrigado John Bartholomew!

A resposta é especificar a hora, por exemplo git log --after="2013-11-12 00:00" --before="2013-11-12 23:59"

3cheesewheel
fonte
12
Agradável. No entanto, esse comando omitirá confirmações entre 23:59 e 00:00 do dia seguinte, portanto git log --after="2013-11-12 00:00" --before="2013-11-13 00:00"é melhor. Eu acredito gitk --since="2013-11-12 00:00" --until="2013-11-13 00:00" &que também funcionaria se você tiver o gitk instalado.
HelloGoodbye
6
No git 2.13.0. git log --after="2017-07-25" --before="2017-07-26"dá resultados válidos para mim.
Powlo 27/07
1
Isso é para o ramo com check-out atual? Como ver através de todos os ramos?
Nawfal 30/10/19
Esta é a resposta correta, mas ainda estou confusa com ela e postei a seguinte pergunta: stackoverflow.com/questions/59691065/…
bgoodr
28

Normalmente, eu checo meu log do git e vejo o que estava trabalhando em um dia específico e atualizo meu quadro de horários com base nisso, mas é difícil digitar a data completa no formato ISO, então eu faço assim

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

e adiciono --authorpara imprimir apenas meus commits

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

Isso imprime confirmações que ocorreram no último dia 9 de junho (portanto, para 2016, neste caso, e não para 2015 ou 2014 e assim por diante).

Os --since/--aftere --until/--beforeparâmetros também pode tirar coisas como 3 days ago, yesterday, etc.

Kohányi Róbert
fonte
Simplesmente não funciona, não produz nada. Estou faltando alguma coisa? Devo especificar uma ramificação?
Aurimas 14/03
1
@ Aurimas Bem, não sei o que deu errado do seu lado. Se seus valores sincee untilnão estiverem corretos, você não terá saída com certeza. Use git logem primeiro lugar, e tentar escolher um sincee untilvalor com base no que você vê. Nenhuma filial ou qualquer coisa especial necessária. Não tenho certeza desde qual versão do Git esse recurso está disponível. Verifique se você possui uma versão recente também.
Kohányi Róbert
6
Eu tive que usar espaços:git log --after="may 2" --before="may 3"
Connor Clark
15

Nada de errado com a resposta aceita (que eu votei), mas ... estamos aqui pela ciência!

A saída abaixo pode ser expandida / personalizada com pretty=format:<string> espaços reservados :

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

Não é 100% imune a erros, pois a mesma sequência poderia ter sido inserida por um usuário. Mas aceitável, dependendo de quais espaços reservados são usados. O snippet acima não falharia, por exemplo.

Pode-se assim apenas analisar o todo git logpara JSONe consumir / manipular seus dados para um de conteúdo coração. Confira https://github.com/dreamyguy/gitlogg e nunca olhe para trás!

Isenção de responsabilidade: esse é um dos meus projetos.

Wallace Sidhrée
fonte
10

Eu criei um alias do git para esse propósito específico:

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
Michael Große
fonte
1
você também pode especificar datas relativas a este alias, ou seja git commitsAtDate yesterday, 2 days ago, etc.
voiger
-2

Esse script exibe o intervalo de datas disponível para confirmações para o repo atual e solicita a data em que você deseja ver as confirmações. Ele exibe um SHA curto e o SHA completo, o autor, o carimbo de data / hora de confirmação e os comentários entre aspas simples.

O script continua solicitando datas até você pressionar Enter ou Control-D.

Usuários de Mac: requer data do 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

Eu chamei o script commitsOnDates, e aqui está em ação. A primeira data que eu insiro não tem confirmação, então a resposta é apenas uma linha vazia:

$ 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:
Mike Slinn
fonte