web-dev-qa-db-ja.com

変更を行わなくてもgit commit --amendがハッシュを変更するのはなぜですか?

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

ハッシュが変化する原因は何ですか?コミットのタイムスタンプと関係がありますか?

29
jub0bs

はい、それはコミットのタイムスタンプです。 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

元のコミットと同じ秒で修正した場合、おそらく同じハッシュを取得します。

30
Thomas

コミットshaオブジェクトの作成では、次のことが行われます

  1. ツリーオブジェクト参照
  2. 親オブジェクト参照
  3. 著者名
  4. 著者のタイムゾーン付きのコミットタイムスタンプ(たとえば、私にとってはその+530)[たとえばチェリーピッキングの場合のコミッターとは異なる]
  5. コミッタ名
  6. タイムスタンプ付きのタイムスタンプをコミットします(私にとっては+530など)
  7. コミットメッセージ

コミットSHA IDがリセットされ、同じ親とツリーオブジェクト参照を持つ同じユーザーによるまったく同じコミットメッセージで同じファイルを再び追加した後、IDが異なる理由を理解しようとしました。

6

Gitコミットを修正すると、コミット日付が変更されます(git logを実行したときに最初に表示される日付とは異なります-コミット日付を確認するにはgit log --format=fullerを実行します)。コミット日付は、コミットハッシュを作成するときに考慮されます。

4
mipadi