¿Por qué git AuthorDate es diferente de CommitDate?

102

Busco mis registros de git y encuentro que AuthorDate y CommitDate son ligeramente diferentes para algunas de mis confirmaciones:

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

El autor y el compromiso es el mismo yo.

¿Como sucedió esto? Estoy perplejo durante días.

Hay más (ocurre en 17 de 341 confirmaciones):

+------------------------------+-------------------------------+
| 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           |
+------------------------------+-------------------------------+
Monitor de peces
fuente
Hmm, parece que sucede cuando se fusionan ramas.
Fish Monitor
1
Relacionado: stackoverflow.com/questions/18750808/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Un efecto secundario inesperado de tener estas dos fechas diferentes: git logde forma predeterminada, solo muestra la fecha de confirmación del Autor. Sin embargo, si se utiliza --since, --until, --before, --after, las fechas relativas, usos git el confirmador se comprometen fecha en lugar! git log --since="yesterday"puede no mostrar los resultados esperados si el autor cometió la fecha es diferente de la Committer fecha cometió.
SherylHohman
Acerca de si la fusión podría alterar las fechas, puede depender de si la fusión está configurada de alguna manera no predeterminada que modifique las confirmaciones. Por ejemplo, git --squash mergees una estrategia de fusión algo común que se puede configurar (aunque no parece que se esté usando aquí, se menciona a modo de ejemplo). Además, si se usa git a través de un IDE o GUI de git, existe la posibilidad de que la configuración / funcionalidad no esté presente en la CLI. Puede valer la pena volver a comprobar para qué está configurada la fusión en el entorno en el que realiza la fusión.
George Pantazes

Respuestas:

160

La fecha del autor indica cuándo se realizó originalmente esta confirmación (es decir, cuándo terminó git commit). Según los documentos de git commit, la fecha del autor podría anularse usando el --dateinterruptor.

La fecha de confirmación cambia cada vez que se modifica la confirmación, por ejemplo, cuando se cambia la base de la rama en la que se encuentra la confirmación en otra rama ( más ).

Lo mismo podría suceder si realiza su confirmación y envía su parche a otro para aplicar el parche en otro repositorio: la fecha del autor será la fecha de su git commit, la fecha de confirmación se establecerá en esa fecha cuando se aplique el parche en el otro repositorio.

Si envía el parche a dos colegas, habrá una fecha de autor pero dos fechas de confirmación diferentes.

Esto también se menciona en el Libro de Git :

Quizás se pregunte cuál es la diferencia entre autor y autor de la confirmación . El autor es la persona que originalmente escribió el parche, mientras que el confirmador es la última persona que aplica el parche. Por lo tanto, si envía un parche a un proyecto y uno de los miembros principales aplica el parche, ambos reciben crédito: usted como autor y el miembro principal como autor de la confirmación.

eckes
fuente
¿Sucederá mi caso al fusionar sucursales?
Fish Monitor
3
No. Creo que la fecha es parte del SHA, así que a menos que realice alguna operación que reescriba el historial, como rebase, no debería cambiar.
asmeurer
2
Una breve descripción de cómo deberíamos esperar que cambien las marcas de tiempo después de una selección selectiva, después de enmendar o reajustar los antepasados ​​de la confirmación se agradecería debidamente. Jugando con git show -s --format="commit %cD author %aD" HEAD, parecería que, por ejemplo, se modifica el mensaje de confirmación con git guiambas actualizaciones, pero git commit --amendsolo se actualiza la fecha de confirmación. poco intuitivo.
init_js
24

La fecha del autor en una confirmación se conserva en rebase / cherry-pick, etc. Pero la fecha de confirmación se cambia.

Michael Anderson
fuente
Algunas confirmaciones en cuestión no son selectivas ni reajustadas. Parecen fusionarse con otra rama.
Fish Monitor
7
También lo hace git commit --amend.
asmeurer