Указанная идентификация является ключевой.
Все это станет гораздо более понятным, когда вы поймете, что Git способен строго подписывать коммиты;таким образом, никто не может подделать историю, даже имена ответственных лиц:)
К комментарию : Git также о доверии,проверяемость источников.В нескольких словах: коммиттер отвечает за коммит и подписывает его (буквально);Автор - тот, кто представил патч в первую очередь - это может быть кто-то «снаружи», кто-то «ненадежный».(_Если у вас возникли проблемы с обдумыванием этого вопроса, рассмотрите проект ядра Linux, исправьте уязвимости безопасности или бэкдоры: пользователям Linux действительно необходимо проверить, что используемое ими ядро было модерировано доверенными членами сообщества!
Дополнительная информация: «Реальный» вопрос
В случае, который я использовал в качестве примера, я являюсь автором коммита, он передается владельцем основного проекта, когдаЯ смотрю на свою очередь форка, я вижу, что мой собственный коммит (тот же автор) попросил (снова) зафиксировать мой форк? Нет никакого способа сказать, что это то же самое!
Ах, естьреальный вопрос! Таким образом, вы не беспокоитесь о том, почему фиксация контрольной суммы, включая комментарии и другие метаданные. Вы также не беспокоитесь о том, почему существуют поля коммиттера и author [1]
Youраздражает тот факт, что объединенный коммит имеет другой идентификатор фиксации, если только это не было слияние ff (перемотка вперед). Теперь есть хороший вопрос! Вот ответ :
Идентификатор коммита зависит также от родительских коммитов, поэтому идентификатор коммита может быть одинаковым только в том случае, если
- родительский идентификатор совпадает
- «снимок» зафиксированного дерева - это то же самое
Единственный случай, когда это происходит, - это форки (ссылки на идентичные коммиты) и ускоренные слияния (в результате ... идентичные ссылки) [2].
Таким образом, как только вы объединяете, выбираете cherry или перебазируете (три аналогичные операции в этом контексте), даже один коммит в другую ветку (читается в другом родительском коммите.), он по определению будет иметь другой идентификатор фиксации, независимо от того, какие метаданные проверены.Это связано с тем, что история дерева различна, и на данный момент это единственные соответствующие метаданные.
Реальный вопрос: как избежать появления дублирующих коммитов?
.
- использовать, например,
git log --left-right --graph --oneline
--cherry-pick
BRANCH1...BRANCH2
для проверки различий между ветвями, в которых происходили отбор вишни или перебазирование.На странице руководства это делает именно то, что вы хотели:
--cherry-pick
Omit any commit that introduces the same change as another commit on the "other side" when the set of commits are limited with symmetric
difference.
For example, if you have two branches, A and B, a usual way to list all commits on only one side of them is with --left-right, like the example
above in the description of that option. It however shows the commits that were cherry-picked from the other branch (for example, "3rd on b" may
be cherry-picked from branch A). With this option, such pairs of commits are excluded from the output.
- и, наконец, если ваша ситуация является одним из частых слияний с повторяющимся конфликтом (например, при использовании не-central ветки тем) смотрите ` git rerere --help , что выходит за рамки этого ответа для меня.
[1] вы даже не беспокоитесь о зафиксировать примечания , которые являются внеполосными и не пересмотрены и не проверены ... sic
[2] В техно лепете: истории коммитов образуют криптографически сильные деревья меркла.Когда сумма sha1 коммита наконечника (HEAD) совпадает, математически следует, что (a) содержимое дерева (b) история ветвей (включая все подписи и учетные данные коммиттера / автора) идентичны.Это огромная функция безопасности git и других SCM, в которых это реализовано.
[3] см. Также git log --merges --boundaries --decorate
и спецификации ревизий, такие как rev1 ... rev2 (обратите внимание на три точки; смотрите man git-rev-parse
)