347

I am trying to make a commit like

git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"

where John Doe is some user in whose name I want to make the commit.

It appears all right in git log. However, when I do a gitk, the author name is correct, but the committer name is picked from my global git config settings (and is thus set to my name/email).

Questions

  1. What is the difference between the two (committer vs author)?

  2. Should I be setting the committer as well to the other user?

  3. If yes, how?

Anshul Goyal
  • 73,278
  • 37
  • 149
  • 186
  • 4
    http://jasonnoble.org/2009/04/github-set-authorcommitter.html here is a short description. – René Höhle Sep 11 '13 at 21:01
  • 2
    Possible duplicate of [What is the difference between author and committer in Git?](http://stackoverflow.com/questions/6755824/what-is-the-difference-between-author-and-committer-in-git) – Marcin Armatys Feb 20 '17 at 14:41
  • Git committer is placed in .gitconfig file. If you --author is same as .gitconfig name, you get only author in commit message. If they are differs, you get both. – poGUIst Nov 14 '19 at 17:42

4 Answers4

315

The original poster asks:

What is the difference between the two (Committer vs author)?

The author is the person who originally wrote the code. The committer, on the other hand, is assumed to be the person who committed the code on behalf of the original author. This is important in Git because Git allows you to rewrite history, or apply patches on behalf of another person. The FREE online Pro Git book explains it like this:

You may be wondering what the difference is between author and committer. The author is the person who originally wrote the patch, whereas the committer is the person who last applied the patch. So, if you send in a patch to a project and one of the core members applies the patch, both of you get credit — you as the author and the core member as the committer.

The original poster asks:

Should I be setting the committer as well to the other user?

No, if you want to be honest, you should not be setting the committer to the author, unless the author and the committer are indeed the same person.

  • 3
    I'm still confused about this. I had this happen, and in my case, as far as I'm aware, no patch or history rewrite ever occurred (unless some git commands create and apply patches, opaquely, "under the hood"). Are those really the only 2 ways for something like this to happen? – cowlinator Feb 14 '19 at 23:19
  • 8
    Also, calling the author the "person who wrote the code" doesn't make sense. How would git know who wrote it? When you set `git config user` and then `git add` and `git commit`, then git would know who added and who committed, but it still would not know who wrote it. – cowlinator Feb 14 '19 at 23:53
  • 10
    @cowlinator It doesn't know who wrote the code. That's why you have to tell it, if it's not you. Keep in mind that the previous distributed version control system before git was invented was sending ~~Linus~~ the project maintainer emails with patches to apply. This functionality is there so ~~Linus~~ the maintainer can apply your patch while still crediting you for it in an 'official' way, rather than just ad-hoc in the commit message. – Nic Feb 27 '19 at 03:28
127

Mailing list + git format-patch + git apply can generate author != committer

In projects like the Linux kernel where patches are:

generating a single new commit with different author and committer:

  • the author is who wrote the patch
  • the committer is who is a project maintainer, and who merged the patch

See for example this randomly selected patch and the corresponding commit:

Git web interfaces like GitHub and GitLab may or may not generate author != committer

Since Git(Hub|Lab) hold both the upstream and the fork repositories on a the same machine, they can automatically do anything that you can do locally as well, including either of:

  • Create a merge commit.

    Does not generate author != committer.

    Keeps the SHA or the new commit intact, and creates a new commit:

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

    Historically, this was the first available method on GitHub.

    Locally, this is done with git merge --no-ff.

    This produces two commits per pull request, and keeps a fork in the git history.

  • rebase on top of master

    GitHub also hacks the commits to set committer == whoever pressed the merge button. This is not mandatory, and not even done by default locally by git rebase, but it gives accountability to the project maintainer.

    The git tree now looks like:

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

    which is exactly like that of the git apply email patches.

On GitHub currently:

  • you choose the method when merging via the dropdown on the merge button
  • methods can be enabled or disabled on the repo settings by the owner

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

How to set the committer of a new commit?

The best I could find was using the environment variables to override the committer:

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'

How to get the committer and commit date of a given commit?

Only author data shows by default on git log.

To see the committer date you can either:

  • format the log specifically for that:

    git log --pretty='%cn %cd' -n1 HEAD
    

    where cn and cd stand for Committer Name and Committer Date

  • use the fuller predefined format:

    git log --format=fuller
    

    See also: How to configure 'git log' to show 'commit date'

  • go low level and show the entire commit data:

    git cat-file -p HEAD
    

How to set the committer date of a new commit?

git commit --date only sets the author date: for the committer date the best I could find was with the environment variable:

GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000'

See also: What is the difference between author and committer in Git?

How Git stores author vs committer internally?

See: What is the file format of a git commit object?

Basically, the commit is a text file, and it contains two line separated fields:

author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}

This makes it clear that both are two completely independent data entries in the commit object.

Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985
5

proposed to use

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'

If you accidentally used different names and emails, and you want to set the to the same values:

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"

which first sets the variables, then uses them for the git commit call (note the double parentheses).

Stephen Rauch
  • 47,830
  • 31
  • 106
  • 135
serv-inc
  • 35,772
  • 9
  • 166
  • 188
  • 6
    does not answer the question, not constructive and not accurate (because the committer is not the author) – Guy Jan 14 '21 at 11:56
  • Granted @guyarad . Some people who after the information in this q&a wish to change both might find this useful, so it remains for now. – serv-inc Jan 18 '21 at 09:46
  • as I said, what you are presenting isn't the *committer* name but the *author* name. So if anything, your answer is simply not accurate. – Guy Jan 19 '21 at 14:00
  • I was not aware that people would misunderstand. Hopefully it's clearer now. – serv-inc Jan 19 '21 at 14:34
  • @YassineElBadaoui: replaced with only given name+surname, as he seems to rename regularly – serv-inc May 17 '21 at 09:53
  • If variables doesn't already exist, or are not exported, the git process won't be able to access it. So to be sure, prepend the assignations with `export` – Pierre-Olivier Vares Dec 17 '21 at 21:07
0

I think it's worth mentioning that the definitions used here are only the intended meanings. For example, from the Pro Git book:

The author is the person who originally wrote the work, whereas the committer is the person who last applied the work.

It's important to realize that you can't trust that the names are correct. Perhaps a more (annoyingly) pedantic definition might be:

The author is the person who (allegedly) originally wrote the work, whereas the committer is the person who (allegedly) last applied the work.

Most of the time we don't really need to trust that the metadata in a commit is true, but if you want to get closer to that goal you can use signed commits, which makes it easier to trust that the Committer is the person who signed the commit.

TTT
  • 22,611
  • 8
  • 63
  • 69