Ou apenas todos os commits que ocorreram entre duas datas? No SVN, você poderia fazer algo como
svn diff -r{date}:{date}
para fazer isso! Não consigo encontrar um Git equivalente a isso.
Especificamente, estou tentando escrever um script para enviar e-mails diários com todo o código confirmado naquele dia e por quem.
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.
Então, a documentação incentiva o uso emgit log
vez degit whatchanged
; este último comando também usa a opção --no-merge do git log, então eles exibem os mesmos resultados.git whatchanged
está obsoleto a partir da versão atual mais recente 2.21.0. Tudogit whatchanged
alcançado pode ser alcançadogit log
e é preservado apenas por razões históricas. Veja detalhes em git-scm.com/docs/git-whatchanged/2.21.0As sugestões anteriores têm algumas desvantagens. Basicamente, eu estava procurando algo equivalente a
cvs diff -D"1 day ago" -D"2010-02-29 11:11"
. Enquanto colhia mais e mais informações, encontrei uma solução.Coisas que eu tentei:
git whatchanged --since="1 day ago" -p
a partir daquiMas isso dá uma diferença para cada commit, mesmo se houver vários commits em um arquivo. Eu sei que "encontro" é um conceito um pouco vago no git , pensei que deve haver alguma maneira de fazer isso.
git diff 'master@{1 day ago}..master
dá alguns avisoswarning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100.
e não mostra todos os diffs.git format-patch --since=yesterday --stdout
não dá 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 se restringe ao ramo atual.Finalmente:
git diff $(git rev-list -n1 --before="1 day ago" master)
parece funcionar e uma maneira padrão de fazer coisas semelhantes , embora mais complicado do que eu pensava.Curiosamente, git-cvsserver não suporta "cvs diff -D" (sem isso está documentado em algum lugar).
fonte
git rev-list
, que ajudou muito a resolver o problema muito semelhante que eu estava vendo.git diff 'master@{1 day ago}..master
sintaxe significa "verifique o reflog e descubra para onde o branchmaster
costumava apontar em seu repositório local1 day ago
". Especificamente, não usará o histórico de commits real do branch atualmaster
. Isso raramente é o que você realmente deseja."data" é um conceito um pouco solto no git. Um commit terá uma data de autor que pode ser algum tempo no passado antes de alguém realmente puxar / submeter o commit em seu repositório, também o commit pode ser rebaseado e atualizado para estar no topo de um commit aparentemente mais recente.
Um commit também tem uma data de commit que é atualizada se um commit for rebatizado ou alterado de alguma forma. É mais provável que esses commits estejam em algum tipo de ordem cronológica, mas você ainda está à mercê do committer com a hora correta definida em seu computador e, mesmo assim, um commit não modificado pode ficar em um branch de recurso em um repositório remoto indefinidamente antes sendo mesclado no branch master de um repositório central.
O que provavelmente é mais útil para seus propósitos é a data de reflog no repositório particular em questão. Se você tiver reflogs por branch habilitado (consulte Recursos
git config core.logAllRefUpdates
), então você pode usar aref@{date}
sintaxe para se referir a onde um branch estava em um determinado momento.Por exemplo
Você também pode usar descrições 'difusas' como:
Esses comandos mostrarão todos os commits que 'apareceram' em um determinado ramo do repositório, independentemente de quão 'antigos' eles realmente são de acordo com seu autor e datas de commit.
Observe que o reflog por ramo é específico para um repositório, portanto, se você estiver executando o comando log em um clone e não puxar por (digamos) um mês, extraia todas as alterações do último mês de uma vez, então, todas as alterações do último mês aparecerão em um
@{1 hour ago}..@{now}
intervalo. Se você for capaz de executar o comando log no repositório 'central' para o qual as pessoas enviam, então ele pode fazer o que você quiser.fonte
@{time spec}
sintaxe refere-se sempre o seu local de reflog . Não se refere ao histórico de confirmação real (DAG). Se você não entende a diferença, não use esta sintaxe!ou
fonte
@{time spec}
sintaxe refere-se sempre o seu local de reflog . Não se refere ao histórico de confirmação real (DAG). Se você não entende a diferença, não use esta sintaxe!Possivelmente
é o que você quer (com ou sem '--stdout')?
fonte
Acredito que a solução geral seja usar:
Sem --first-parent, você pode obter um commit de um branch que mais tarde foi mesclado,
a ref
mas não havia sido mesclado até entãoa date string
.Aqui está uma alternativa usando
--children
e emgrep
vez de-n1
:Eu não estava familiarizado com isso
git whatchanged
antes de ler este P&R, mas dá resultados muito diferentes para mim, então não tenho certeza do que está fazendo.fonte
Outra maneira simples de obter uma comparação de todas as alterações desde uma determinada data é simplesmente encontrar o primeiro commit
X
que ocorreu nessa data ou após, então usarIsso tem a vantagem de não depender de entradas de reflog em um clone novo, ao contrário do
soluções em
fonte
Esta é uma resposta mais engraçada, porque provavelmente existe uma maneira melhor. Isso mostrará todos os hashes de commit de hoje.
; ·)
fonte
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ão] para especificar o intervalo de commits.
fonte
Para observar as mudanças dos arquivos Git de uma data para outra em seu branch, use a seguinte fórmula:
Fórmula :
Observe que as datas estão no formato AAAA-MM-DD :
Se você gostaria de observar as mudanças em um arquivo específico em um intervalo de tempo específico (observe a diferença no código), basta navegar no arquivo atual:
Exemplo :
fonte
Vou colocar a maneira que faço:
git log
por uma data dá a você commit hashes para o branch atual. Então eu apenas uso algo como ogit diff 8fgdfg8..565k4l5
que me dá a diferença adequada agregada por arquivos. Espero que isso ajude, mas não testei muitofonte