【问题标题】:Why does git commit --amend change the hash even if I don't make any changes?即使我不做任何更改,为什么 git commit --amend 也会更改哈希?
【发布时间】:2014-07-10 14:46: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

是什么导致哈希发生变化?和提交的时间戳有关系吗?

【问题讨论】:

    标签: git sha git-amend


    【解决方案1】:

    在创建提交 sha 对象时进行以下操作

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

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

    【讨论】:

      【解决方案2】:

      是的,它是提交时间戳。检查两个提交的内容显示:

      $ 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
      

      如果您在原始提交的同一秒内进行了修改,大概您会得到相同的哈希值。

      【讨论】:

      • 是的。如果我在执行git commit -m "initial commit" 的同一系统时钟秒内运行git commit --amend -m "initial commit",我可以确认哈希不会改变。感谢您消除我的疑问。
      • @Jubobs - 值得指出的是,如果您希望 SHA 被触及,您可以在编辑器中删除所有非注释行,然后保存提交消息。然后 git 会注意到提交消息是空的,并且不做任何事情。如果您开始提交然后意识到“哎呀,我应该先做一件事”或其他任何事情(或者在这个特定的用例中,也许您意识到修改将是不好的并且您不想这样做,这可能会很有用)。
      • 是的。或者,在 vim 中,使用 :cquit 命令以非零退出代码进行救助,这也会导致 git 放弃。
      • 您还可以在提交时更改指定任何作者日期和/或提交者日期....查看GIT_COMMITTER_DATEgit commit --date
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-12-04
        • 2023-03-20
        • 1970-01-01
        • 2012-07-07
        • 2011-12-04
        • 2017-09-23
        • 2011-07-07
        • 2011-06-14
        • 1970-01-01
        相关资源
        最近更新 更多