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
ハッシュが変化する原因は何ですか?コミットのタイムスタンプと関係がありますか?
はい、それはコミットのタイムスタンプです。 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
元のコミットと同じ秒で修正した場合、おそらく同じハッシュを取得します。
コミットshaオブジェクトの作成では、次のことが行われます
コミットSHA IDがリセットされ、同じ親とツリーオブジェクト参照を持つ同じユーザーによるまったく同じコミットメッセージで同じファイルを再び追加した後、IDが異なる理由を理解しようとしました。
Gitコミットを修正すると、コミット日付が変更されます(git log
を実行したときに最初に表示される日付とは異なります-コミット日付を確認するにはgit log --format=fuller
を実行します)。コミット日付は、コミットハッシュを作成するときに考慮されます。