Git критерии для сравнения коммитов, зачем включать коммиттера? - PullRequest
5 голосов
/ 18 мая 2011

Git использует хэш SHA1 для идентификации объекта коммита, и согласно Git Book объект коммитов содержит:

  • дерево
  • указатель наболее старый коммит (родитель)
  • отметка времени
  • имя автора
  • имя коммитера
  • ...

Что удивляетМне нужно как author , так и commiter в объекте коммита, действительно это быстро проблема при объединении коммита в другой идентичный репозиторий, так как хэш коммита изменится!

Моя точка зрения проиллюстрирована GitHub , в вашей Fork Queue вы даже можете найти свой собственный коммит, как только ваши изменения будут объединены с исходным проектом!Как правило, это "метаконфликт" , потому что тот, кто инициировал изменение, один и тот же, и кто совершает коммит, не должен изменять характер коммита ...

Итак, зачем это нужно?Это злоупотребление автором и коммиттером?Я понимаю необходимость обоих , я не понимаю , почему оба должны быть включены в хеш коммита , и почему бы не в другом месте?

Можно ли не согласиться с тем, что одно и то же изменение, зафиксированное в разных репо, должно быть идентифицировано как одно и то же, поэтому исключить имя коммитера из хеша?

Ответы [ 3 ]

6 голосов
/ 18 мая 2011

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

Наличие обоих также помогает определить, кто на самом деле совершил изменение в определенной ветви, поскольку автор, возможно, разработал изменение в одной ветви, но затем оно было выбрано для другой.

3 голосов
/ 18 мая 2011

Указанная идентификация является ключевой.

Все это станет гораздо более понятным, когда вы поймете, что Git способен строго подписывать коммиты;таким образом, никто не может подделать историю, даже имена ответственных лиц:)


К комментарию : Git также о доверии,проверяемость источников.В нескольких словах: коммиттер отвечает за коммит и подписывает его (буквально);Автор - тот, кто представил патч в первую очередь - это может быть кто-то «снаружи», кто-то «ненадежный».(_Если у вас возникли проблемы с обдумыванием этого вопроса, рассмотрите проект ядра Linux, исправьте уязвимости безопасности или бэкдоры: пользователям Linux действительно необходимо проверить, что используемое ими ядро ​​было модерировано доверенными членами сообщества!


Дополнительная информация: «Реальный» вопрос

В случае, который я использовал в качестве примера, я являюсь автором коммита, он передается владельцем основного проекта, когдаЯ смотрю на свою очередь форка, я вижу, что мой собственный коммит (тот же автор) попросил (снова) зафиксировать мой форк? Нет никакого способа сказать, что это то же самое!

Ах, естьреальный вопрос! Таким образом, вы не беспокоитесь о том, почему фиксация контрольной суммы, включая комментарии и другие метаданные. Вы также не беспокоитесь о том, почему существуют поля коммиттера и author [1]

Youраздражает тот факт, что объединенный коммит имеет другой идентификатор фиксации, если только это не было слияние ff (перемотка вперед). Теперь есть хороший вопрос! Вот ответ :

Идентификатор коммита зависит также от родительских коммитов, поэтому идентификатор коммита может быть одинаковым только в том случае, если

  1. родительский идентификатор совпадает
  2. «снимок» зафиксированного дерева - это то же самое

Единственный случай, когда это происходит, - это форки (ссылки на идентичные коммиты) и ускоренные слияния (в результате ... идентичные ссылки) [2].

Таким образом, как только вы объединяете, выбираете cherry или перебазируете (три аналогичные операции в этом контексте), даже один коммит в другую ветку (читается в другом родительском коммите.), он по определению будет иметь другой идентификатор фиксации, независимо от того, какие метаданные проверены.Это связано с тем, что история дерева различна, и на данный момент это единственные соответствующие метаданные.

Реальный вопрос: как избежать появления дублирующих коммитов?

  • предпочтительнее слияния, чем cherry-pick / rebase

    • при объединении результирующий коммит будет иметь два родительских коммита ;это позволяет git отслеживать отслеживание слияния и автоматически устранять перекрывающиеся коммиты (т. е. те, которые уже были объединены).git diff, git merge-base, git log rev1 ^rev2, git show-branch все соблюдают эту логику).Вот почему повторяющиеся слияния (крест-накрест, голубиные хвосты и т. Д.) Работают «волшебно» на git.[3]

      • SKEPTICS : если вы отправляете запрос на извлечение в апстрим, они не могут объединить вашу ветку, делая этот совет 'трудно достичь.Однако ничто не мешает вам

        • объединить свою ветвь после того, как они приняли вашу работу (тот же конечный результат, немного больше работы)
        • отменить вашу собственную ветку от своей после того, как они приняли вашу работу (тот же конечный результат)

.

  • использовать, например, 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)

3 голосов
/ 18 мая 2011

Это потому, что иногда автор не является участником проекта;например, они представили патч или разделили собственное git-репо.Когда участник проекта подписывает изменение и фиксирует его, оно сохраняет указание автора, а также информацию о том, кто совершил и одобрил изменение.

...