В чем разница между автором и коммиттером в 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 rebase
GitHub также взламывает коммиты для установки коммиттера == кто бы ни нажал кнопку слияния.Причиной этого является то, что это дает подотчетность сопровождающему проекта.
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
отобразит сообщение автора и коммитера.