Каждый коммит имеет две отметки даты и времени, а не только одну. Одна временная метка предназначена для автора , а другая - для коммиттера . В новом коммите, который вы только что сделали с нуля, Git устанавливает одинаковые автора и коммиттера, а две метки времени - одинаковыми. Копирование коммита, однако, приводит к новому коммиттеру (вам и сейчас) при сохранении оригинального коммита автора и меток времени автора, по крайней мере по умолчанию.
Когда вы используете git rebase
или git commit --amend
, чтобы «изменить» коммит, вы на самом деле не изменяете исходный коммит. Вы не можете - ничто не может;даже сам Git не может изменить исходный коммит - поэтому вместо этого вы получаете новый коммит с новым идентификатором хеша, уникальным для нового коммита. Старый идентификатор хэша все еще действителен и все еще ссылается на старый коммит. Если старый коммит становится недостижимым , 1 , он со временем истечет и старый коммит действительно исчезнет, но Git изо всех сил старается держать его как минимум месяц или около того, вна случай, если вы передумаете об этом и захотите его вернуть.
То, что вы здесь не показываете, это как вы работаете git log
. То, что Git не показывает здесь - потому что вы не просили об этом - является базовым графом коммитов . Git - это коммиты, а сами коммиты образуют направленный ациклический граф или DAG. Многие команды и программы просмотра Git действительно должны показывать вам график, потому что этот график очень важен. Команда git log
может показать вам график, но вы должны попросить его:
git log --graph
или мой любимый:
git log --all --decorate --oneline --graph
См. Красивые графы веток git и, в частности, этот ответ .
Чтобы Git показал вам обе отметки даты и времени, добавьте --pretty=fuller
и пропустите --oneline
, например:
git log --all --decorate --graph --pretty=fuller
В этом случае оба ваших исходных коммита и вашего перефразированного коммита по-прежнему достижимы - хотя точно, как я не могу сказать без просмотраграфик - так что вы видите перефразированный коммит с его новым идентификатором хеша и показывает его новое сообщение ... а затем вы также видите исходный коммит с его оригинальным идентификатором хеша и показывающий его оригинальное сообщение.
Графическое средство просмотра или запуск git log
с --decorate
и --graph
, поможет объяснить , почему вы все еще можете увидеть старый коммит. Без графа и его «украшений» - названий веток и тегов, которые позволяют Git найти коммитов, в первую очередь, в беспорядке случайных хеш-идентификаторов - все, что мы можем сделать, это догадаться почему также отображается ваш старый коммит.
1 Это технический термин с довольно длинным определением. Посетите веб-сайт Думайте как (а) Git , чтобы начать работу с этим.