Почему git commit --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'
затем, вызывая
git log --pretty=oneline --abbrev-commit
выводит следующее сообщение:
b96a901 initial commit
Я тогда вообще
git commit --amend
но я передумал и решил ничего не менять в последнем коммите. Другими словами, я оставляю файлы, каталоги и сообщение последней фиксации нетронуты (я просто сохраняю файл сообщения и закрываю свой редактор).
тогда я делаю
git log --pretty=oneline --abbrev-commit
еще раз, я вижу, что хэш фиксации изменился:
3ce92dc initial commit
что вызывает изменение хэша? Имеет ли это отношение к отметке времени фиксации?
3 ответов
Да, он фиксирует время. Проверка содержимого двух коммитов показывает:
$ 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
Если вы изменили в ту же секунду, что и исходная фиксация, предположительно, вы получите тот же хэш.
следующие вещи идут в создании объекта commit sha
- ссылка на объект дерева
- ссылка на родительский объект
- имя автора
- автор совершает отметку времени с часовым поясом (e.g для меня ее +530) [может быть отличается от commiter, например, в случае cherry picking]
- имя коммиттер
- фиксация метки времени с часовым поясом (e.g для меня ее +530)
- фиксация
Я пытался выяснить, почему идентификаторы commit SHA отличаются после сброса и снова добавления того же файла с точно таким же сообщением о фиксации одним и тем же пользователем с той же родительской ссылкой и ссылкой на объект дерева .
изменение git commit изменяет дату фиксации (которая отличается от даты, которую вы изначально видите при запуске git log
-- run git log --format=fuller
чтобы увидеть дату фиксации). Дата фиксации учитывается при создании хэша фиксации.