Почему git AuthorDate отличается от CommitDate?

102

Я просматриваю свои журналы git и обнаруживаю, что AuthorDate и CommitDate немного отличаются для некоторых моих коммитов:

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

Автор и Коммит - это я.

Как это произошло? Я недоумеваю несколько дней.

Есть и другие (происходит в 17 из 341 коммита):

+------------------------------+-------------------------------+
| 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           |
+------------------------------+-------------------------------+
Рыбный монитор
источник
Хм, вроде как происходит при слиянии веток.
Fish Monitor
1
По теме: stackoverflow.com/questions/18750808/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Один неожиданный побочный эффект наличия этих двух разных дат: git logпо умолчанию отображается только дата фиксации автора. Но если вы используете --since, --until, --before, --after, относительные даты, Git использует коммиттер дату совершения вместо этого! git log --since="yesterday"может не показать ожидаемые результаты , если автор фиксации дата отличается от коммиттер даты совершения.
Шерил Хохман
О том, могло ли слияние изменять даты, это может зависеть от того, настроено ли слияние каким-либо нестандартным способом, который изменяет коммиты. Например, git --squash mergeэто довольно распространенная стратегия слияния, которую можно настроить (хотя не похоже, что она здесь используется, она приведена для примера). Кроме того, если git используется через IDE или графический интерфейс git, существует возможность конфигурации / функциональности, отсутствующей в CLI. Возможно, стоит дважды проверить, для чего настроено ваше слияние в среде, в которой вы выполняете слияние.
Джордж Пантазес,

Ответы:

160

Дата автора отмечает, когда эта фиксация была первоначально сделана (то есть когда вы закончили git commit). Согласно документам git commit, дату автора можно переопределить с помощью --dateпереключателя.

Дата фиксации изменяется каждый раз, когда фиксация изменяется, например, при перебазировании ветви, в которой фиксация находится в другой ветке ( подробнее ).

То же самое может произойти, если вы сделаете фиксацию и отправите свой патч в другой, чтобы применить патч в другом репо: дата автора будет датой вашего git commit, дата фиксации будет установлена ​​на эту дату, когда патч будет применен в другое репо.

Если вы отправите патч двум коллегам, будет одна дата автора, но две разные даты фиксации.

Это также упоминается в Git Book :

Вам может быть интересно, в чем разница между автором и коммиттером . Автор это человек , который первоначально написал патч, в то время как коммиттер это человек , который последним применил патч. Итак, если вы отправляете патч в проект, и один из основных участников применяет патч, вы оба получаете признание - вы как автор и основной участник как коммиттер.

Eckes
источник
Будет ли мой случай при объединении веток?
Fish Monitor
3
Нет. Я считаю, что дата является частью SHA, поэтому, если вы не выполните какую-либо операцию, которая перезаписывает историю, например, перебазирование, она не должна измениться.
asmeurer 08
2
Было бы должным образом оценено краткое описание того, как мы должны ожидать изменения временных меток после выбора вишни, после изменения или перенастройки предков коммита. Поиграясь с git show -s --format="commit %cD author %aD" HEADэтим, может показаться, что, например, изменение сообщения о фиксации git guiобновляет оба, но git commit --amendобновляет только дату коммиттера. не интуитивно понятный.
init_js 02
24

Дата автора коммита сохраняется в rebase / cherry-pick и т. Д. Но дата коммита изменена.

Майкл Андерсон
источник
Некоторые коммиты, о которых идет речь, не являются ни выбором вишни, ни перемещением. Они выглядят как слияние другой ветки.
Fish Monitor
7
Так делает git commit --amend.
asmeurer 08