2015-05-27 3 views
3

Каждый git совершает атрибут хеш, который «подписывает» его содержимое. Он также подписывает, откуда взялся коммит, или это только данные фиксации, которые используются для расчета хэша?Является ли git commit hash равным состоянию репозитория?

По-разному: невозможно ли (помимо хеш-коллизий) создать второй репозиторий с головной фиксацией, имеющей тот же самый хэш и тот же контент, но остальная часть дерева отличается?

+1

Каждый коммит реф к предыдущей, более подробно здесь: https://git-scm.com/book/en/v2/Git- Internals-Git-Objects # Commit-Objects –

+0

спасибо за дополнительную ссылку – PhilLab

ответ

2

Ответ на второй вопрос: да (невозможно и т. Д.).

Первый вопрос не так хорошо сформирован, как я думаю, вы можете захотеть, потому что хеш-фиксация на самом деле просто основана на данных фиксации. Ключ, который вызывает ответ на второй Вопрос в том, что «в совершающие данные» включает в себя следующие основные элементы, которые вы можете увидеть в фактической фиксации:

$ git cat-file -p HEAD 
tree 22abd5c3fed5e2f49fb71e10b39d8c4929e51fc7 
parent 4ebdeb68ba87282f87c39d790ba17fe1e021cc97 
parent 9eabf5b536662000f79978c4d1b6e4eff5c8d785 
[snip] 

tree линия дает хэш дерева (которое зависит только на содержимом дерева) и parent строк-два, в этом случае, как HEAD является слиянием commit-дать хэши родительской фиксации. Учитывая, что хеш текущего фиксации зависит от хеш (е) его дерева и родительских элементов, если вы должны были построить другое репо с другой историей или другим деревом, у них были бы разные хэши, чтобы коммит также имеют другой хеш.

(технический термин, обычно используемый здесь Merkle Tree.)

Смежные вопросы