为什么即使我不进行任何更改,git commit --amend也会更改哈希值?

jub*_*0bs 28 git sha git-amend

为什么即使我在运行后没有对提交(消息,文件)进行任何更改,我最新提交的SHA-1哈希值也会发生变化git commit --amend

假设我在命令行运行以下命令.

cd ~/Desktop
mkdir test_amend
cd test_amend
git init
echo 'foo' > test.txt
git add test.txt
git commit -m 'initial commit'
Run Code Online (Sandbox Code Playgroud)

然后,调用

git log --pretty=oneline --abbrev-commit
Run Code Online (Sandbox Code Playgroud)

打印以下消息:

b96a901 initial commit
Run Code Online (Sandbox Code Playgroud)

然后我做

git commit --amend
Run Code Online (Sandbox Code Playgroud)

但我改变主意,决定不改变最后一次提交中的任何内容.换句话说,我保持最后一次提交的文件,目录和消息不变(我只保存消息文件并关闭我的编辑器).

然后,我做

git log --pretty=oneline --abbrev-commit
Run Code Online (Sandbox Code Playgroud)

再一次,我看到提交的哈希值发生了变化:

3ce92dc initial commit
Run Code Online (Sandbox Code Playgroud)

是什么导致哈希改变?是否与提交的时间戳有关?

Tho*_*mas 31

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

$ 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
Run Code Online (Sandbox Code Playgroud)

如果你在原始提交的同一秒内修改,可能你会得到相同的哈希值.

  • 是的.如果我在执行`git commit -m"initial commit"`的同一系统时钟秒内运行`git commit --amend -m"initial commit",我可以确认哈希不会改变.谢谢你清除我的怀疑. (13认同)
  • @Jubobs - 值得指出的是,如果你确实想要触摸SHA,你可以删除编辑器中的所有非注释行,然后保存提交消息.然后git会注意到提交消息是空的,而不是做任何事情.如果你开始提交然后意识到"哎呀,我应该先做一件事"或者其他什么(或者在这个特定的用例中,或许你意识到修改会很糟糕而且你不想这样做),这可能很有用. ). (3认同)
  • 是的.或者,在vim中,使用`:cquit`命令使用非零退出代码进行挽救,这也会导致git放弃. (2认同)

mip*_*adi 8

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


Abh*_*der 6

接下来的事情是创建commit sha对象

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

我试图弄清楚为什么在重置之后提交SHA ID是不同的,并且再次使用具有相同父级和树对象引用的相同用户添加具有完全相同提交消息的相同文件.