Gitユーザー設定の極意:名前、メールアドレス、エディタのデフォルト設定

名前、メールアドレス、テキストエディタなど、GitユーザーIDの基本的な設定方法を学びます。この包括的なガイドでは、`git config`を使用したグローバル設定とリポジトリ固有の設定について説明し、コミットが正しく属性付けされ、すべてのプロジェクトで一貫性が保たれるようにすることで、コラボレーション体験を大幅に向上させます。

Gitユーザー設定の極意:名前、メールアドレス、エディタのデフォルト設定

Gitのユーザー設定は、初めて自分の作業コミットが間違ったメールアドレスで表示されたり、会社のコントリビューショングラフに変更の半分が欠けていたり、Gitが終了方法がわからないエディタを開いたりするまでは、退屈に見えます。修正は通常簡単です。名前、メールアドレス、エディタを意図的に設定し、1つのリポジトリに対してそれらを上書きする方法を知っておくことです。

重要なのは、すべてのgit configフラグを暗記することではありません。Gitが設定をどこから読み取るのか、そしてコミットする前にGitが使用する最終的な値を確認する方法を理解することです。


Git設定レベルの理解

Gitは設定ファイルの階層を採用しています。上位レベルで定義された設定は、下位レベルで定義された設定によって上書きされる可能性があります。これらのレベルを理解することで、設定を詳細に、または普遍的に適用できます。

主な設定レベルは3つあります。

  1. システムレベル(--system:マシン全体のすべてのユーザーとすべてのリポジトリに適用されます。専用のビルドサーバーを管理する場合を除き、ユーザーIDに使用されることはほとんどありません。
  2. グローバルレベル(--global:マシン上の現在のユーザーが所有するすべてのリポジトリに適用されます。ここで通常、プライマリのuser.nameuser.emailを設定します。
  3. ローカルレベル(--local:現在いる特定のリポジトリにのみ適用されます。これにより、特定のプロジェクト(例:仕事用と個人用)で異なるIDを使用できます。

現在の設定の表示

変更を加える前に、Gitが現在何を使用するように設定されているかを確認すると便利です。すべてのレベルまたは特定のレベルの設定を一覧表示できます。

# すべてのレベルのすべての設定を表示
$ git config --list

# グローバル設定のみを表示
$ git config --global --list

ユーザーIDの設定(名前とメールアドレス)

名前とメールアドレスは、Gitに保存されるユーザー情報の中で最も重要な部分です。これらは、誰が変更を行ったかを識別します。

1. グローバルユーザーIDの設定

ほとんどのユーザーにとって、名前とメールアドレスをグローバルに設定することは、推奨される最初のステップです。これにより、将来のすべてのプロジェクトにこのデフォルトのIDが確実に適用されます。プレースホルダーを実際の情報に置き換えてください。

名前の設定:

$ git config --global user.name "あなたのフルネーム"

メールアドレスの設定:

特にSSHキーやコミット署名を使用する場合は、GitHub/GitLab/Bitbucketアカウントに関連付けられたメールアドレスを使用することを強くお勧めします。

$ git config --global user.email "[email protected]"

ベストプラクティス: ホスティングプロバイダーにリンクされた正確なメールアドレスを使用して、リモートプラットフォームでコントリビューションが正しく表示されるようにします。

2. 特定のリポジトリのIDを上書きする(ローカルレベル)

特定の属性を必要とするプロジェクト(例:クライアントリポジトリに仕事用メールを使用する)に貢献する場合があります。そのリポジトリ内でのみグローバル設定を上書きできます。

リポジトリのルートディレクトリに移動し、--globalフラグを付けずに設定コマンドを実行します。

# プロジェクトディレクトリに移動
$ cd ~/projects/client-project-alpha

# このリポジトリに特定の名前を設定
$ git config user.name "仕事用名前"

# このリポジトリに特定のメールアドレスを設定
$ git config user.email "[email protected]"

このリポジトリ内でコミットすると、Gitはグローバル設定の代わりにこれらのローカル設定を使用します。

GitがIDを選択する方法

Gitがコミットを処理するとき、ローカル -> グローバル -> システムの順にレベルをチェックします。user.nameまたはuser.emailに対して最初に見つかった設定が使用されます。


デフォルトのテキストエディタの設定

Gitが入力(コミットメッセージの作成、リベースの指示、マージ競合解決のメモなど)を必要とするとき、設定されたテキストエディタを開きます。デフォルトでは、vivimのような基本的なターミナルエディタである可能性があり、新しいユーザーにとっては難しい場合があります。

グローバルエディタ設定の構成

--globalフラグを使用して、すべてのマシンまたはプロジェクトで好みのエディタを使用するようにGitを設定できます。

VS Codeをエディタとして使用する

Visual Studio Codeを好み、コマンドライン統合(code)がインストールされている場合は、次のように設定します。

$ git config --global core.editor "code --wait"

--waitフラグは重要です。これは、VS Codeで開かれたファイルを閉じるまでGitの実行を一時停止し、コミットメッセージが確定されるようにします。

Sublime Textをエディタとして使用する

Sublime Textユーザーの場合:

$ git config --global core.editor "subl -n -w"

NanoまたはVimを使用する(すでに使い慣れている場合)

シンプルなターミナルエディタを好む場合:

# Nanoの場合
$ git config --global core.editor "nano"

# Vimの場合(多くの場合デフォルト)
$ git config --global core.editor "vim"

エディタ設定のテスト

エディタ設定が機能しているかどうかをテストする最も簡単な方法は、メッセージを必要とする修正を行うか、-mフラグを指定せずにコミットを作成することです。

# ダミーファイルを作成し、-mなしでコミットを試みる
$ touch tempfile.txt
$ git add tempfile.txt
$ git commit 
# これにより、新しく設定されたエディタが開くはずです。

既存の間違ったIDを修正する

user.nameuser.emailを変更しても、将来のコミットにのみ影響します。既存のコミットは書き換えられません。最後のコミットの作成者が間違っていて、まだプッシュしていない場合は、設定を修正した後に修正できます。

$ git config user.name "正しい名前"
$ git config user.email "[email protected]"
$ git commit --amend --reset-author

間違ったコミットがすでに共有ブランチにプッシュされている場合は注意してください。公開された履歴を書き換えると、他の人に混乱を引き起こす可能性があります。プライベートブランチの場合は、修正とフォースプッシュが許容される場合があります。

$ git push --force-with-lease

共有ブランチの場合、より安全な方法は、多くの場合、履歴をそのままにして、将来のコミットのためにIDを修正することです。多くのコミットを修復する必要がある場合は、チームと調整した後にのみ、履歴書き換えツールを使用してください。

値の出所を確認する

Gitの動作がおかしい場合、git config --listはノイズが多すぎることがあります。--show-originを使用すると、Gitが各値を提供したファイルを教えてくれます。

$ git config --show-origin --list

次のような出力が表示される場合があります。

file:/Users/alex/.gitconfig    [email protected]
file:.git/config               [email protected]

これは、現在のリポジトリではリポジトリローカルの値が優先されることを意味します。これは、「グローバルメールを変更したのにGitがまだ古いものを使っている」という問題を診断する最速の方法です。

1つの値を問い合わせることもできます。

$ git config --show-origin user.email

持続可能な仕事用と個人用の設定

一般的なパターンは、個人用のグローバルIDを維持し、仕事用リポジトリでローカルに上書きすることです。

$ git config --global user.name "Alex Rivera"
$ git config --global user.email "[email protected]"

$ cd ~/work/payments-api
$ git config user.email "[email protected]"

一部のチームは、別々のディレクトリに別々のクローンを作成することを好みます。新しいバージョンのGitは条件付きインクルードをサポートしており、パス下のリポジトリに対して仕事用設定を自動的にロードできます。

# ~/.gitconfig
[user]
    name = Alex Rivera
    email = [email protected]

[includeIf "gitdir:~/work/"]
    path = ~/.gitconfig-work
# ~/.gitconfig-work
[user]
    email = [email protected]

正確なパスマッチングルールはプラットフォームによって少し驚くことがあるので、実際のリポジトリ内でテストしてください。

$ cd ~/work/some-repo
$ git config --show-origin user.email

回避できるエディタの問題

core.editor設定は、主にGitがメッセージや指示ファイル(マージコミット、インタラクティブリベース、コミット修正、-mなしのコミット)を必要とする場合に重要です。GitがVimを開き、使い慣れていない場合、コマンドがスタックしているように感じることがあります。

VS Codeの場合、--waitフラグは必須です。

$ git config --global core.editor "code --wait"

--waitがないと、Gitはファイルを開き、メッセージの書き込みが完了する前にすぐに続行する可能性があります。ターミナルのみのサーバーでは、nanoの方が驚きが少ないことがよくあります。

$ git config --global core.editor "nano"

実際のプロジェクト変更を作成せずにエディタをテストできます。

$ git commit --allow-empty

テストメッセージを書き、保存し、不要な場合は空のコミットを削除します。

$ git reset --soft HEAD~1

コミット署名とホスティングアカウント

Gitのメールアドレスは認証とは別です。SSHキー、パーソナルアクセストークン、ブラウザログインは、プッシュできるかどうかを決定します。user.emailは、コミットオブジェクトに書き込まれる作成者メールを決定します。

ホスティングプロバイダーは通常、メールアドレスでコミットをアカウントに一致させます。プライバシーメールを使用する場合は、その正確なアドレスを設定します。

$ git config --global user.email "[email protected]"

組織が署名付きコミットを必要とする場合、IDは設定の一部にすぎません。user.signingkeycommit.gpgsign、またはSSH署名設定も必要になる場合があります。これらは基本的な名前/メール設定とは別にしておくと、一度に1つのレイヤーをデバッグできます。

作成者、コミッター、および環境の上書き

Gitは各コミットに作成者とコミッターの両方を保存します。ほとんどの場合、これらは同じ人物です。別の開発者からパッチを適用したり、コミットをリベースしたり、元々他の人が書いたコミットを修正したりする場合に異なります。

両方のフィールドは次の方法で表示できます。

$ git log --format=fuller -1

この出力は、「Gitが間違ったメールを使用した」と誰かが言ったが、通常の1行ログには作成者しか表示されない場合に役立ちます。メンテナーがパッチを適用したか、リベースがコミットを再作成したために、コミッターが異なる場合があります。

Gitは環境変数からIDを読み取ることもできます。

$ GIT_AUTHOR_NAME="Build Bot" \
  GIT_AUTHOR_EMAIL="[email protected]" \
  git commit -m "生成されたファイルを更新"

CIシステムはこのパターンを使用することがあります。意図的な場合は問題ありませんが、パイプラインがこれらの変数を開発者シェルやローカルスクリプトにリークすると混乱を招きます。Gitが設定を無視する場合は、環境を確認してください。

$ env | rg '^GIT_(AUTHOR|COMMITTER)'

コミットする前に、偶発的な上書きを解除します。

$ unset GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL

履歴の混乱を防ぐ小さなチームポリシー

チームにとって、最適なGitユーザー設定ポリシーは通常、短いものです。

  • 実際の名前、またはチームが認識している同じハンドルを使用します。
  • 会社のリポジトリには会社のメールアドレスを使用します。
  • 検証済みのホスティングプロバイダーのメールアドレスを使用して、コミットが正しいアカウントに添付されるようにします。
  • チームが同意しない限り、古い作成者メタデータをクリーンアップするためだけに共有履歴を書き換えないでください。
  • オンボーディングスクリプトがそれに依存する場合にのみ、推奨されるcore.editorを文書化します。

メールドメインのpre-commitまたはpre-pushチェックを追加できますが、親しみやすいものにしてください。誰かが別のマシンからペアリングしているためにすべてのコミットをブロックするローカルフックは、摩擦を生み出します。サーバーサイドポリシーまたは保護されたブランチのCIチェックの方が、通常は管理が簡単です。

以下は、作業コードをプッシュする前に手動で実行できる簡単なローカルチェックです。

$ git config user.email
$ git log --format='%h %ae %s' origin/main..HEAD

会社のブランチに個人のメールアドレスが表示されているコミットがある場合は、プルリクエストを開く前に修正してください。後でマージされたブランチを修復するよりもはるかに簡単です。

一般的な設定の驚きのトラブルシューティング

git config --global user.emailに正しい値が表示されているのに、コミットが別のものを使っている場合は、ローカルオーバーライドのあるリポジトリ内にいないか確認してください。

$ git config --local user.email
$ git config --show-origin user.email

ローカル値が間違っている場合は、置き換えるか、設定を解除します。

$ git config user.email "[email protected]"
$ git config --unset user.email

ローカル値を解除すると、Gitは再びグローバル値にフォールバックします。これは、すべてのリポジトリに同じ値を設定するよりも、多くの場合すっきりします。

GitがAuthor identity unknownと表示した場合、Gitが設定または環境から使用可能なuser.nameuser.emailを見つけられなかったことを意味します。両方を設定し、1つだけではありません。

$ git config --global user.name "Alex Rivera"
$ git config --global user.email "[email protected]"

共有サーバーでは、マシンを全員のために管理している場合を除き、--systemは避けてください。システムレベルのIDは、無関係なユーザーが誤って同じ人物としてコミットする原因となる可能性があります。ビルドエージェントが主な例外ですが、そこでもCIワークスペースまたはサービスアカウントを明示的に設定する方が通常は優れています。

クイックチェックリスト

  • デフォルトのIDやエディタなど、すべての場所に適用される設定にはgit config --globalを使用します。
  • リポジトリ内でgit config(フラグなし)を使用して、グローバル設定をローカルで上書きします。
  • どのファイルが優先されているかを知る必要がある場合は、git config --show-origin --listを使用します。
  • 最新のコミットを書き換えることが適切な場合にのみ、git commit --amend --reset-authorを使用します。
  • グラフィカルエディタを設定するときは--waitを使用して、編集が完了するまでGitが待機するようにします。