В чем разница между автором и коммиттером в Git?

Я только что натолкнулся на следующий коммит на GitHub: https://github.com/felixge/node-formidable/commit/0a0b150668daa3c6f01626d2565b898e5da12392

Как можно иметь несколько авторов на одном и том же коммите?

4 ответа

Решение

Это не совсем два автора - это автор и коммиттер. Два поля имеют разные значения. Автор - это тот, кто создал контент, а коммиттер - тот, кто его зафиксировал. Когда вы делаете нормальный коммит, вы оба. (И оба приходят с соответствующей электронной почтой и отметкой времени.)

Но они могут стать разными по нескольким ключевым причинам:

  • git format-patch / git am - эта пара позволяет вам преобразовывать коммиты в патчи, обычно отправляемые по электронной почте, а затем заставлять их применять кто-то другой. Вы остаетесь автором; человек, который применяет их, является коммиттером. Это вполне определенно то, что произошло на GitHub там.

  • git commit --amend, git rebase, git filter-branch - Все это в основном варианты переписывания истории, от одного коммита до некоторой истории ветки и всей истории. Они могут потенциально изменять информацию о коммитере - в частности, они всегда переписывают метку времени коммиттера. Первоначальный автор остается на месте (в режимах работы по умолчанию), и если автор также переписывает текст, его имя и адрес электронной почты остаются, но временная метка, естественно, отличается.

С этим коммитом не связано несколько авторов (и в настоящее время невозможно назначить несколько авторов одному коммиту). В этом случае автором был gliese1337, а автором был felixge. Скорее всего, это произошло из-за того, что gliese1337 отправил запрос на извлечение, который был принят и затем передан felixhe (владельцем хранилища). Этот рабочий процесс довольно распространен на GitHub. Это также полезно в тех случаях, когда сопровождающий проекта получает исправление по электронной почте, поэтому сам автор исправления по-прежнему получает кредит на исправление, даже если он или она не имеет доступа к проекту.

Пара связанных ссылок:

Короткий Git Wiki раздел об авторстве
Запрос функции для нескольких авторов в ядре Git

Это не несколько авторов. Один - автор, а другой - коммиттер.

Если бы вы сделали клон, вы могли бы видеть это ясно:

$ git cat-file -p 0a0b150668daa3c6f016
tree 91edcb411b7cd0708c1f5bb05621846146c9425a
parent 6b9ffe3653fe59f035b01ba1f46b5f2650be00ca
author Logan Kearsley <chronosurfer@gmail.com> 1308937685 -0700
committer Felix Geisendo╠Иrfer <felix@debuggable.com> 1309117893 +0200

Slight but definite & consistent performance boost.

Веб-интерфейс Git, такой как GitHub и GitLab

В таких системах при слиянии патча автор может или не может отличаться от коммиттера в зависимости от настроек репо.

Поскольку Git(Hub|Lab) хранит оба репозитория upstream и fork на одной машине, он может автоматически делать все, что вы можете делать и локально:

  • Создать коммит слияния.

    Не генерирует автора!= Коммиттер.

    Сохраняет SHA или новый коммит без изменений и создает новый коммит:

    * Merge commit (committer == author == project maintainer)
    |\
    | * Feature commit (committer == author == contributor)
    |/
    * Old master (random committer and author)
    

    Исторически это был первый доступный метод на GitHub.

    На местном уровне это делается с git merge --no-ff,

    Это производит два коммита на запрос на извлечение и сохраняет ветвь в истории git.

  • перебазировать поверх master

    Хотя это не является обязательным в принципе, и даже не делается по умолчанию локально git rebaseGitHub также взламывает коммиты для установки коммиттера == кто бы ни нажал кнопку слияния.

    Причиной этого является то, что это дает подотчетность сопровождающему проекта.

    Git tree теперь выглядит так:

    * Feature commit (committer == maintainer, author == contributor)
    |
    * Old master (random committer and author)    
    

    что точно так же, как у git apply почтовые патчи.

На данный момент на GitHub:

  • вы выбираете метод при слиянии через выпадающий на кнопку слияния
  • методы могут быть включены или отключены в настройках репо владельцем

https://help.github.com/articles/about-merge-methods-on-github/

Короче говоря, когда вы выполняете Pull Request в репозиторий, размещенном на gihub/gitlab/etc, и принимаете его сопровождающим, вы являетесь автором, а он / она - коммитером.

И когда вы git клонировали это репо, используйте git cat-file -p xxx_hash отобразит сообщение автора и коммитера.

Другие вопросы по тегам