Por que git AuthorDate é diferente de CommitDate?


102

Eu procuro meus logs git e descubro que AuthorDate e CommitDate são ligeiramente diferentes para alguns de meus commits:

commit 3a5912f90dc5227f308e99f95152fbee2301c59a
Author:     <hidden>
AuthorDate: Fri Jun 15 10:57:22 2012 +0800
Commit:     <hidden>
CommitDate: Fri Jun 15 11:14:37 2012 +0800

O autor e o compromisso são o mesmo eu.

Como isso acontece? Estou confuso há dias.

Há mais (acontece em 17 de 341 commits):

+------------------------------+-------------------------------+
| from_unixtime(authored_date) | from_unixtime(committed_date) |
+------------------------------+-------------------------------+
| 2012-06-15 10:57:22          | 2012-06-15 11:14:37           |
| 2012-06-15 14:39:54          | 2012-06-15 14:48:57           |
| 2012-06-19 12:28:21          | 2012-06-19 12:29:41           |
| 2012-06-21 18:16:25          | 2012-06-21 18:28:48           |
| 2012-06-26 17:30:54          | 2012-06-26 17:33:55           |
| 2012-07-13 11:41:43          | 2012-07-13 11:42:17           |
| 2012-07-13 11:56:02          | 2012-07-13 12:13:22           |
| 2012-07-13 12:05:09          | 2012-07-13 12:12:24           |
| 2012-07-12 18:38:49          | 2012-07-13 12:26:35           |
| 2012-07-13 11:00:47          | 2012-07-13 12:25:15           |
| 2012-07-16 14:10:54          | 2012-07-16 14:15:01           |
| 2012-07-13 12:56:51          | 2012-07-16 13:49:48           |
| 2012-07-16 14:10:54          | 2012-07-16 14:19:46           |
| 2012-07-24 16:05:05          | 2012-07-24 16:05:48           |
| 2012-07-24 17:42:58          | 2012-07-24 17:43:33           |
| 2012-07-24 17:42:58          | 2012-07-24 17:45:18           |
| 2012-07-26 16:55:40          | 2012-07-26 16:55:53           |
+------------------------------+-------------------------------+

Hmm, parece que está acontecendo ao mesclar ramos.
Fish Monitor de


Um efeito colateral inesperado de ter essas duas datas diferentes: git logpor padrão, mostra apenas a data de confirmação do Autor. Mas se você usar --since, --until, --before, --after, datas relativas, usos git o Committer data comprometer em vez disso! git log --since="yesterday"pode não mostrar os resultados esperados se a data de confirmação do Autor for diferente da data de confirmação do Committer .
SherylHohman

Sobre se a fusão pode estar alterando as datas, pode depender se a fusão está configurada de alguma forma não padrão que modifica os commits. Por exemplo, git --squash mergeé uma estratégia de mesclagem um tanto comum que pode ser configurada (embora não pareça que esteja sendo usada aqui, ela foi criada para fins de exemplo). Além disso, se o git estiver sendo usado por meio de um IDE ou GUI do git, há a possibilidade de configuração / funcionalidade não presente na CLI. Pode valer a pena verificar
novamente o

Respostas:


160

A data do autor indica quando este commit foi feito originalmente (ou seja, quando você terminou o git commit). De acordo com os documentos de git commit, a data do autor pode ser substituída usando a --dateopção.

A data do commit é alterada toda vez que o commit está sendo modificado, por exemplo, ao rebasar o branch onde o commit está em outro branch ( mais ).

O mesmo pode acontecer se você fizer seu commit e enviar seu patch para outro a fim de aplicar o patch em outro repo: a data do autor será a data do seu git commit, a data de commit será definida para aquela data quando o patch for aplicado em o outro repo.

Se você enviar o patch para dois colegas, haverá uma data de autor, mas duas datas de confirmação diferentes.

Isso também é mencionado no livro Git :

Você pode estar se perguntando qual é a diferença entre autor e committer . O autor é a pessoa que escreveu originalmente o patch, enquanto o committer é a última pessoa que aplicou o patch. Portanto, se você enviar um patch para um projeto e um dos membros principais aplicar o patch, ambos receberão crédito - você como autor e o membro principal como o autor do commit


O meu caso acontecerá ao mesclar ramos?
Fish Monitor de

3
Não. Eu acredito que a data faz parte do SHA, então a menos que você execute alguma operação que reescreva o histórico, como rebasing, ela não deve mudar.
asmeurer em

2
Uma breve descrição de como devemos esperar que os timestamps mudem após uma escolha seletiva, depois de emendar ou rebasear ancestrais do commit seria devidamente apreciada. Brincando git show -s --format="commit %cD author %aD" HEAD, pareceria que, por exemplo, alterar a mensagem de commit com git guiatualizações de ambos, mas git commit --amendapenas atualiza a data do committer. não intuitivo.
init_js

24

A data do autor em um commit é preservada no rebase / escolha aleatória, etc. Mas a data de commit é alterada.


Alguns commits em questão não são selecionados ou rebaseing. Eles se parecem com a fusão de outro ramo.
Fish Monitor de

7
E também git commit --amend.
asmeurer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.