Como posso obter o diff entre todos os commits que ocorreram entre duas datas com Git?

StackOverflow https://stackoverflow.com/questions/1161609

  •  18-09-2019
  •  | 
  •  

Pergunta

ou apenas todos os commits que ocorreram entre duas datas? No SVN, você poderia fazer algo como

svn diff -r{date}:{date}

para fazê-lo! Eu não consigo encontrar um Git equivalente a isso.

Especificamente eu estou olhando para escrever um script para enviar e-mails diários com todo o código cometidos naquele dia e por quem.

Foi útil?

Solução

Você pode usar git whatchanged --since="1 day ago" -p

Ele também leva um argumento --until.

Docs

Outras dicas

As sugestões anteriores têm algumas desvantagens. Basicamente, eu estava procurando por algo equivalente a cvs diff -D"1 day ago" -D"2010-02-29 11:11". Durante a coleta de mais e mais informações, eu encontrei uma solução.

Coisas que eu tentei:

  • git whatchanged --since="1 day ago" -p de aqui

    Mas isso dá uma diff para cada commit, mesmo se houver vários commits em um arquivo. Eu sei que " data" é um pouco de um conceito solto no git , eu pensei que deve haver alguma maneira de fazer isso.

  • git diff 'master@{1 day ago}..master dá alguma warning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100. aviso e não mostra todos os diffs.

  • git format-patch --since=yesterday --stdout não dar nada para mim.

  • revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1) funciona de alguma forma, mas parece complicado e não restringe ao ramo atual.

Finalmente:

Funnily, git-cvsserver não suporta "cvs -d diff" (em algum lugar, sem que ele está documentado).

"data" é um pouco de um conceito solto no git. Um cometer terá uma data de autor que pode ser algum tempo bem no passado, antes que alguém realmente puxa / compromete a cometer em seu repositório, também a confirmação pode ser rebased e atualizado para estar no topo de uma aparentemente mais recente cometer.

A também cometem tem uma data que é atualizado se um commit é rebased ou alterada de alguma forma comprometer. Estes commits são mais propensos a estar em algum tipo de ordem cronológica, mas você ainda está à mercê do committer tendo o conjunto hora correta em seu computador e, mesmo assim, uma não modificada cometer pode sentar-se em um ramo de funcionalidade em um repositório remoto indefinidamente antes sendo incorporado ao ramo principal de um repositório central.

O que é provavelmente o mais útil para seus propósitos é a data reflog no repositório particular em questão. Se você tem reflogs por ramo habilitado (ver git config core.logAllRefUpdates), então você pode usar a sintaxe ref@{date} para se referir ao local onde um ramo foi em um momento particular.

por exemplo.

git log -p master@{2009-07-01}..master@{now}

Você também pode usar descrições 'difusos' como:

git log -p "master@{1 month ago}..master@{yesterday}"

Estes comandos irá mostrar todos os commits que 'apareceram' no ramo dado do repositório, independentemente de como 'velho' que eles realmente estão de acordo com seu autor e comprometer datas.

Note que o reflog por ramo é específico para um repositório, por isso, se você estiver executando o comando log em um clone, e você não puxe para (digamos) um mês em seguida, puxe todas as mudanças para o último mês ao mesmo tempo, em seguida, todas as mudanças do último mês irá aparecer em uma gama @{1 hour ago}..@{now}. Se você é capaz de executar o comando log no repostory 'central' que as pessoas empurrar para, então ele pode fazer o que quiser.

git diff --stat @{2013-11-01}..@{2013-11-30}

ou

git diff --stat @{2.weeks.ago}..@{last.week}

Talvez

$ git format-patch --committer=<who> --since=yesterday --stdout

é o que você quer (com ou sem '--stdout')?

Eu acredito que a solução geral é usar:

git rev-list -n1 --first-parent --until=<a date string> <a ref>

Sem --first-pai, você pode obter uma confirmação de um ramo que mais tarde foi incorporada pela a ref mas não tinha sido fundida a partir de a date string.

Aqui está uma alternativa usando --children e grep vez de -n1:

mlm_git_ref_as_of() {
    # # Examples #
    #
    # Show all commits between two dates:
    #
    #     git log $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
    #
    # Show diffs of all commits between two dates:
    #
    #     git diff $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
    local as_of="$1"
    local ref="${2:-HEAD}"
    # Get the most recent commit (--children, grep -v ' ') that was on
    # the given branch ($ref, --first-parent) as of a given date
    # ($as_of)
    git rev-list --children --first-parent --until="$as_of" "$ref" | grep -v ' '
}

Eu não estava familiarizado com git whatchanged antes de ler este Q & A, mas dá resultados muito diferentes para mim, então eu não tenho certeza do que ele está fazendo.

Outra forma simples que você pode obter um diff de todas as mudanças desde uma determinada data é encontrar simplesmente a primeira cometer X que ocorreu em ou após essa data, em seguida, usar

git diff X

Isto tem a vantagem de não depender de entradas reflog em um clone fresco, ao contrário do

git diff <reference>@{n}..
git log <reference>@{n}..

soluções em

Esta é mais uma resposta engraçado, porque é provável que exista uma maneira melhor. Isto irá mostrar todos cometem hashes para hoje.

git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`

; ·)

Você também pode usar git-format -patch para preparar patches (diffs) e enviá-los por e-mail.

Use as opções [desde] ou [intervalo de revisões] para especificar commits variar.

Vou jogar da maneira que eu fazê-lo: git log para uma data dá-lhe cometer hashes para o ramo atual. Então eu só usar algo como git diff 8fgdfg8..565k4l5 que me dá diferença adequada agregados por arquivos. Espero que isso ajude, não testada muito embora

Para assistir arquivos de mudanças de data a data em seu ramo, usar a seguinte fórmula :

  1. Checkout seu ramo.
  2. puxar e atualizar as alterações do repositório remoto
  3. arquivos relógio diff a partir da data de intervalo de data

exemplo:

git checkout <branch>
git pull
git diff --stat @{fromDate}..@a{toDate}

Preste atenção as datas estão em AAAA-MM-DD formato:

git diff --stat @{2019-08-20}..@a{2019-08-21}

Se você gostaria de observar altera em arquivo específico no intervalo de tempo específico (diff relógio no código), basta navegar o arquivo atual:

exemplo:

git diff @{2019-01-01}..@{2019-01-02} ~/dev/myApp/package.json
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top