pendientes - ¿Por qué git commit--amend cambia el hash incluso si no hago ningún cambio?
git ver archivos modificados (3)
¿Por qué el hash SHA-1 de mi último compromiso cambia incluso si no hago ningún cambio en el compromiso (mensaje, archivos) después de ejecutar git commit --amend
?
Digamos que ejecuto lo siguiente en la línea de comandos.
cd ~/Desktop
mkdir test_amend
cd test_amend
git init
echo ''foo'' > test.txt
git add test.txt
git commit -m ''initial commit''
Luego, invocando
git log --pretty=oneline --abbrev-commit
imprime el siguiente mensaje:
b96a901 initial commit
Entonces hago
git commit --amend
pero cambio de opinión y decido no cambiar nada en el último compromiso. En otras palabras, dejo los archivos, los directorios y el mensaje de la última confirmación intactos (solo guardo el archivo de mensaje y cierro mi editor).
Entonces lo hago
git log --pretty=oneline --abbrev-commit
Una vez más, veo que el hash de la confirmación ha cambiado:
3ce92dc initial commit
¿Qué causa el hash para cambiar? ¿Tiene que ver con la marca de tiempo del commit?
Al enmendar una confirmación de Git se modifica la fecha de confirmación (que es diferente de la fecha que ve inicialmente cuando ejecuta git log
- ejecute git log --format=fuller
para ver la fecha de confirmación). La fecha de confirmación se tiene en cuenta al crear el hash de confirmación.
Las siguientes cosas van en la creación de cometer sha objeto
- referencia de objeto de árbol
- referencia de objeto principal
- nombre del autor
- el autor comenta la marca de tiempo con la zona horaria (p. ej., para mí su +530) [podría ser diferente del comit, por ejemplo, en el caso de la recolección de cerezas]
- nombre del remitente
- cometer marca de tiempo con zona horaria (por ejemplo, para mí es +530)
- cometer mensaje
Estaba tratando de averiguar por qué los ID de SHA de confirmación son diferentes después de restablecer y agregar nuevamente el mismo archivo con exactamente el mismo mensaje de confirmación por el mismo usuario con la misma referencia de objeto principal y de árbol.
Sí, es la marca de tiempo de compromiso. La inspección de los contenidos de los dos compromisos revela:
$ git cat-file commit 82c7363bcfd727fe2d6b0a98412f71a10c8849c9
tree d87cbcba0e2ede0752bdafc5938da35546803ba5
author Thomas <xxx> 1400700200 +0200
committer Thomas <xxx> 1400700200 +0200
hello
$ git cat-file commit 7432fcf82b65d9d757efd73ef7d6bff4707f99bd
tree d87cbcba0e2ede0752bdafc5938da35546803ba5
author Thomas <xxx> 1400700200 +0200
committer Thomas <xxx> 1400700214 +0200
hello
Si modificas en el mismo segundo que la confirmación original, probablemente obtendrás el mismo hash.