Gitでの作者とコミッターの違いは?


237

私はコミットをしようとしています

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

John Doeは、自分の名前をコミットしたいユーザーです。

で大丈夫ですgit log。ただし、を実行するgitk、作成者名は正しいですが、コミッター名は私のグローバルgit構成設定から選択されます(したがって、私の名前/メールに設定されます)。

ご質問

  1. 2つ(コミッターvs著者)の違いは何ですか?

  2. コミッターも他のユーザーに設定する必要がありますか?

  3. はいの場合、どうやって?


4
jasonnoble.org/2009/04/github-set-authorcommitter.htmlここに簡単な説明があります。
ルネHöhle


Gitコミッターは.gitconfigファイルに配置されます。--authorが.gitconfig名と同じ場合、コミットメッセージで作成者のみを取得します。それらが異なる場合は、両方を取得します。
poGUIst

回答:


216

元のポスターは尋ねます:

2つ(コミッターvs著者)の違いは何ですか?

作者は、最初にコードを書いた人です。一方、コミッターは、元の作者に代わってコードをコミットした人と見なされます。Gitでは履歴を書き換えたり、他の人に代わってパッチを適用したりできるため、これはGitで重要です。無料オンラインプロGitの本はこのようにそれを説明します:

著者コミッターの違いは何か疑問に思われるかもしれません。著者は一方で、元々パッチを書いた人物であるコミッターが、最後のパッチを適用した人物です。そのため、プロジェクトにパッチを送信し、コアメンバーの1人がパッチを適用した場合、両方がクレジットを取得します—著者としてのあなたとコミッターとしてのコアメンバー。

元のポスターは尋ねます:

コミッターも他のユーザーに設定する必要がありますか?

いいえ、正直になりたい場合は、作者とコミッターが実際に同じ人物でない限り、コミッターを作者に設定しないでください。


1
私はまだこれについて混乱しています。私はこれを経験しました、そして私の場合、私が知る限り、パッチや履歴の書き換えは発生しませんでした(いくつかのgitコマンドが不透明に「内部で」パッチを作成して適用しない限り)。このようなことが起こる唯一の2つの方法は本当にありますか?
カウリネーター

2
また、作者を「コードを書いた人」と呼んでも意味がありません。誰がそれを書いたかをgitはどうやって知るのでしょうか?あなたが設定しgit config user、それgit addからgit commit、そしてその後、gitは誰が追加し誰がコミットしたかを知っていますが、それは誰がそれを書いたかまだわかりません。
カウリネーター

1
@cowlinator誰がコードを書いたかわかりません。それがあなたでなければ、それを言わなければならない理由です。gitが開発される前の以前の分散バージョン管理システムは、~~ Linus ~~を適用するパッチを含むプロジェクトメンテナーメールを送信していたことに注意してください。この機能はそこにあるので、~~ Linus ~~メンテナは、コミットメッセージでその場限りではなく、「公式」な方法でパッチを適用しながらパッチを適用できます。
モニカの訴訟に資金を

92

メーリングリスト+ git format-patch+ git apply作成者を生成できます!=コミッター

パッチがあるLinuxカーネルのようなプロジェクトでは:

作成者とコミッターが異なる単一の新しいコミットを生成する:

  • 作者はパッチを書いた人です
  • コミッターはプロジェクトのメンテナーであり、パッチをマージした人です

たとえば、このランダムに選択されたパッチと対応するコミットを参照してください。

GitHubやGitLabなどのGit Webインターフェースは、作成者を生成する場合としない場合があります!=コミッター

Git(Hub | Lab)は同じマシン上でアップストリームリポジトリとフォークリポジトリの両方を保持するため、次のいずれかを含め、ローカルで実行できるすべてのことを自動的に実行できます。

  • マージコミットを作成します。

    著者を生成しません!=コミッター。

    SHAまたは新しいコミットをそのまま保持し、新しいコミットを作成します。

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

    歴史的に、これはGitHubで利用可能な最初の方法でした。

    ローカルでは、これはで行われgit merge --no-ffます。

    これにより、プルリクエストごとに2つのコミットが生成され、git履歴にフォークが保持されます。

  • 上にリベース master

    GitHubはコミットをハッキングして、マージボタンを押した人をコミッター==に設定します。これは必須ではなく、デフォルトでによってローカルで行われることもありませんgit rebaseが、プロジェクトのメンテナに説明責任を与えます。

    gitツリーは次のようになります。

    * 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/

新しいコミットのコミッターを設定するには?

私が見つけた最高のものは、環境変数を使用してコミッターをオーバーライドすることでした:

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

特定のコミットのコミッターとコミット日付を取得するにはどうすればよいですか?

デフォルトでは、著者データのみが表示されますgit log

コミッターの日付を表示するには、次のいずれかを実行できます。

  • 具体的には、ログをフォーマットします。

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

    どこcncd立つCommitter NameCommitter Date

  • fuller事前定義された形式を使用します。

    git log --format=fuller
    

    参照:「コミットログ」を表示するように「git log」を設定する方法

  • 低レベルにして、コミットデータ全体を表示します。

    git cat-file -p HEAD
    

新しいコミットのコミッター日付を設定する方法は?

git commit --date 著者の日付のみを設定します。コミッターの日付については、環境変数を使用して見つけることができました。

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

参照:Gitでの作者とコミッターの違いは何ですか?

Gitはどのようにして作成者とコミッターを内部的に保存しますか?

参照:git commitオブジェクトのファイル形式は何ですか?

基本的に、コミットはテキストファイルであり、2行で区切られたフィールドが含まれています。

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

これにより、両方がコミットオブジェクト内の2つの完全に独立したデータエントリであることが明確になります。


1
GIT_COMMITTER_*オーバーライドを使用しても、を使用してデフォルトのコミッターを設定していない場合、gitはコミットの実行を拒否しますgit config
adelphus

1
Git 2.5では@adelphus、両方を設定すると機能しますGIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli郝海东冠状病六四事件法轮功

3

@Ciro Santilli新疆改造中心六四事件法轮機能の使用を提案

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

名前とメールの重複を避けるために、それらを再利用できます

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

これは、最初に個別のコマンドで変数を設定し、次にそれらをgit commit呼び出しに使用します(二重括弧に注意してください)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.