为什么即使我没有做任何更改,git commit --amend 也会改变哈希值?

43
为什么在运行git commit --amend之后,即使我没有对提交(消息、文件)进行任何更改,我的最新提交的SHA-1哈希值也会发生变化?
假设我在命令行中运行以下命令。
cd ~/Desktop
mkdir test_amend
cd test_amend
git init
echo 'foo' > test.txt
git add test.txt
git commit -m 'initial commit'

然后,调用
git log --pretty=oneline --abbrev-commit

打印以下信息:
b96a901 initial commit

我然后做。
git commit --amend

但是我改变了主意,决定不在最后一次提交中做任何更改。换句话说,我保持上次提交的文件、目录和消息不变(只保存消息文件并关闭编辑器)。
然后,我执行
git log --pretty=oneline --abbrev-commit

再来一次,我看到提交的哈希值已经改变了:
3ce92dc initial commit

什么导致哈希值发生变化?这是否与提交的时间戳有关?

3个回答

43

是的,这是提交时间戳。检查这两个提交的内容会揭示出:

$ 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

如果您在与原始提交相同的秒数内进行更改,那么您很可能会得到相同的哈希值。


17
没错。我可以确认,如果我在运行“git commit -m“initial commit””后的同一系统时钟秒内运行“git commit --amend -m“initial commit””,哈希值不会改变。感谢您解除我的疑虑。 - jub0bs
6
值得注意的是,如果您不希望更改SHA,请在编辑器中删除所有非注释行,然后保存提交信息。 git 将注意到提交消息为空,并且不做任何操作。如果您开始提交,然后意识到“糟糕,我应该先做一件事情”或其他类似情况(或者在这个特定的用例中,您意识到修改将是不好的,您不想这样做),这可能会很有用。 - Per Lundberg
3
没错。或者在 vim 中使用 :cquit 命令以非零的退出代码退出,这也会导致 git 放弃操作。 - Thomas
1
你也可以在提交时更改指定的作者日期和/或提交者日期... 可以查看 GIT_COMMITTER_DATEgit commit --date - JoelFan

11

创建提交 SHA 对象需要以下内容:

  1. 树对象引用
  2. 父对象引用
  3. 作者姓名
  4. 带有时区的作者提交时间戳(例如对我来说是+530) [在某些情况下,可能与提交者不同,比如在 cherry picking 的情况下]
  5. 提交者姓名
  6. 带有时区的提交时间戳(例如对我来说是+530)
  7. 提交消息

我试图弄清楚为什么在重置后再次添加相同的文件,由同一用户使用相同的父对象和树对象引用以及完全相同的提交消息时,提交 SHA ID 会不同。


8
修改Git提交会更改提交日期(与运行git log时最初看到的日期不同--运行git log --format=fuller以查看提交日期)。提交日期在创建提交哈希时被考虑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接