◀ 8.

Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意

▶

Gitのuser.nameとuser.emailは、新しいcommitに記録する作者情報です。ログイン認証、署名の検証、過去の履歴変更とは別に扱い、まず対象repoの設定元と有効値を確認します。

Gitの作者情報の設定範囲を選び新しいcommitを作ってauthorとcommitterを確認する図

元コード11ブロックは保持し、危険な履歴変更や旧コメントの誤りは各例の直前で区別しています。

この記事の要点
  • user.name / user.emailはcommitに記録する作者情報。globalは全員に必須ではなく、認証情報とも別
  • スコープ: --global(~/.gitconfig 全リポジトリ)/ --local(当該リポ .git/config のみ)/ --system(OS 全体)
  • GitHub に email を露出させたくない場合は privacy email(XXX+username@users.noreply.github.com)を使用
  • includeIfは一致するGitディレクトリで追加設定を読む。パス/読み込み順とlocalの指定も確認
  • コミット署名: GPG / SSH 署名鍵で commit に "Verified" バッジを付与可能

最低限の初期設定

commitを作る前に、意図した名前と公開してよいメールが使われるか確認します。既存の設定がある場合もあり、cloneやfetchだけのためにglobalの作者情報を設定する必要はありません:

次は旧global例です。仕事/個人で分けるなら対象repoのlocalを検討し、rebase/editor/改行設定まで一括投入しません。core.autocrlf inputとtrueはOS別の選択例で、連続実行すると後の値になり、.gitattributes等のプロジェクト方針も確認します。

# 全リポジトリ共通の名前と email
git config --global user.name "Yamada Taro"
git config --global user.email "taro@example.com"

# その他の推奨初期設定
git config --global init.defaultBranch main
git config --global pull.rebase true
git config --global core.editor "vim"
git config --global core.autocrlf input        # Linux/macOS
git config --global core.autocrlf true         # Windows

# 確認
git config --global --list
git config --get user.name
git config --get user.email

スコープ: global / local / system

スコープ保存先対象範囲
--system配布元/OSに応じたsystem設定。/etc/gitconfig等全ユーザの全リポジトリ
--global~/.gitconfig、XDG_CONFIG_HOME/git/config等そのユーザの全リポジトリ
--local.git/config(リポ毎、デフォルト)当該リポジトリのみ
--worktree各worktreeのconfig.worktree(正確な場所は構成による)extensions.worktreeConfig有効時の個別設定。無効時の扱いは版/構成を確認し、複数worktreeではエラーとなる版もある

通常の単一値設定ではsystem/global/localの順に後の値が優先され、worktree設定を有効にした場合やコマンドscope等もあります。include/includeIfは読み込んだ位置に挿入されます。全キーが単一値ではなく、--listは重複した値も表示するので、有効値だけの一覧とは考えません。作者/committerには環境変数等による指定もあり、configの値だけで最終記録を保証しません。

次は既存repoのメールを変更する操作です。まず作業場所と現在の値/設定元を確認し、例の会社メールを実在する自分のアドレスと扱いません。変更は今後のcommit向けで、過去の記録は変わりません。

# プロジェクト毎に別 email を使う
cd ~/work/company-project
git config --local user.email "taro@company.co.jp"

# 確認(local 優先で表示)
git config user.email          # → taro@company.co.jp
git config --global user.email # → taro@example.com(個人用)

GitHub のプライベート Email

コマンドラインで作成したcommitにはその時の作者/committerのメールが記録され、公開履歴から読めます。GitHubのWeb設定を変えるだけでは手元のGit設定は変わりません。非公開用のnoreplyを使う場合は、GitHubの自分のEmails画面に表示される正確なアドレスを確認します。ID付き/なしの形式を例から推測しません:

  1. GitHub Settings → Emails → Keep my email addresses private をオン
  2. 表示される 12345678+username@users.noreply.github.com をコピー
  3. Git に設定

次のrebase/amendをメール設定の続きとして実行しません。global/localの変更は今後のcommit向けで、過去の修正とは別です。--root/--exec/--reset-authorは履歴全体や作者情報等を変更し、未共有でも退避・対象/復旧の確認が必要です。noreplyの設定だけをしたい場合は履歴書換えを含めないでください。

git config --global user.email "12345678+username@users.noreply.github.com"

# 既存リポジトリで過去コミットの email も書き換えたい
git config --local user.email "12345678+username@users.noreply.github.com"
git rebase -i --root --exec "git commit --amend --reset-author --no-edit"
# ⚠ 履歴書き換え。共有リポでは禁止

仕事用 / 個人用の自動切替

includeIf 機能を使えば、ディレクトリパスに応じて自動で設定を切り替えられます:

次は既存ファイル全体を上書きする指示ではなく、includeIfの構造例です。既存のinclude/設定順を保持し、一致するパスを各repoで確認します。

# ~/.gitconfig
[user]
    name = Yamada Taro
    email = taro@personal.example.com

[includeIf "gitdir:~/work/"]
    path = ~/.gitconfig-work

[includeIf "gitdir:~/oss/"]
    path = ~/.gitconfig-oss

次のABCD...は使えない鍵IDの例です。会社メールを選ぶために署名まで必須ではありません。鍵の準備なしにgpgsign=trueを入れるとcommitが失敗するため、メールの切替と署名運用を分けます。

# ~/.gitconfig-work
[user]
    email = taro@company.co.jp
    signingkey = ABCD1234FEDC

[commit]
    gpgsign = true

次のnoreplyは説明用です。必ず自分のGitHub画面の値を使い、他人や例のIDをコピーしません。

# ~/.gitconfig-oss
[user]
    email = 12345678+yamada@users.noreply.github.com

この設定は一致条件と読み込み順が合えば追加ファイルの値を使います。末尾/は配下を含むパターンになりますが、照合対象はGitディレクトリで、worktree/submoduleでは作業フォルダの見た目だけと一致しないことがあります。localや環境変数の別指定も確認し、実際の各リポジトリで有効値と次のcommitの記録を確かめてください。

署名付きコミット (GPG / SSH 署名)

署名作成とGitHub上での検証結果は別です。対応する署名方式・公開鍵登録・GitHubの検証条件等を満たす必要があり、設定を有効にすれば必ずVerifiedになるわけではありません。署名はコード内容の安全性や実行者の権限を保証しません:

GPG 鍵

次は署名運用を別途準備する旧例で、作者名/メール設定の必須手順ではありません。固定鍵IDを使わず、既存の鍵/期限・管理/失効/公開鍵登録を確認します。秘密鍵は共有せず、鍵一覧の出力にも個人情報があるため公開しません。

# GPG 鍵を生成
gpg --full-generate-key
# RSA 4096 / 期限 / 名前 / email を入力

# 鍵 ID を取得
gpg --list-secret-keys --keyid-format=long
# sec   rsa4096/ABCD1234EFGH5678 2024-01-01 [SC]

# Git に登録
git config --global user.signingkey ABCD1234EFGH5678
git config --global commit.gpgsign true
git config --global tag.gpgsign true

# GitHub に公開鍵を登録
gpg --armor --export ABCD1234EFGH5678
# 出力を GitHub Settings → SSH and GPG keys → New GPG key に貼り付け

SSH 鍵で署名 (Git 2.34+)

次のSSH署名は対応Git/OpenSSH・鍵/agentと検証側の信頼設定が必要です。接続認証用に登録した鍵と署名用の登録は別に確認します。allowed_signersへの追記は誰を信頼するかを決める操作で、単なるメール確認として既存ファイルへ書き込みません。

# 既存の SSH 鍵 (~/.ssh/id_ed25519) を流用可能
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true

# allowed_signers ファイル設定(検証用)
echo "taro@example.com $(cat ~/.ssh/id_ed25519.pub)" >> ~/.ssh/allowed_signers
git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers

# GitHub の SSH キー登録画面で "Signing Key" タイプを選択

確認・修正

次の旧コメントは訂正が必要です。--listは重複を含む全設定を列挙し、「上書き解決済みの有効値だけ」ではありません。表示には秘密値等が含まれる場合があり、--unsetや--editも確認ではなく変更です。設定元と必要なキーだけを自分で確認してください。

# 設定一覧(優先度順、上書き解決済)
git config --list

# 各スコープ個別
git config --global --list
git config --local --list
git config --system --list

# どこで設定されたか追跡
git config --show-origin --get user.email
# file:/home/taro/.gitconfig    taro@example.com

# 値の削除
git config --global --unset user.name
git config --local --unset user.email

# 直接ファイル編集
git config --global --edit          # ~/.gitconfig を $EDITOR で開く

よくあるトラブル

「Please tell me who you are」エラー

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'taro@DESKTOP.(none)')

作者情報を用意できない等の場合のメッセージです。user.useConfigOnlyや環境変数も確認し、今のリポジトリに合う値を設定します。上のglobal例を無条件にコピーせず、GitHubのログイン名やSSH鍵を変えて解決する問題とは分けます。

過去コミットの author を一括変更

次のfilter-branch/filter-repoは通常の作者設定に実行しません。Git公式はfilter-branchに多くの落とし穴があると警告しています。別ツールへの置換でも履歴変更の影響はなくならず、pipでの追加・tag/branch全体の変更や部分文字列replaceを安易に実行しません。メールだけでなく作者名/committer・署名/ID・共有先も含めて個別に設計します。

# 個人 → 会社 email に書き換え(共有リポでは禁止)
git filter-branch --env-filter '
OLD_EMAIL="taro@personal.example.com"
NEW_NAME="Yamada Taro"
NEW_EMAIL="taro@company.co.jp"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]; then
    export GIT_COMMITTER_NAME="$NEW_NAME"
    export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]; then
    export GIT_AUTHOR_NAME="$NEW_NAME"
    export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

# モダンには git-filter-repo を使う
pip install git-filter-repo
git filter-repo --email-callback '
  return email.replace(b"taro@personal.example.com", b"taro@company.co.jp")
'

GitHub で「Unverified」バッジが付く

GitHubが表示する検証理由を確認し、署名の有無/方式・公開鍵登録・メール/アカウントや鍵の状態等を照合します。GPG/SSHでは検証条件が異なり、メール不一致だけと断定しません。ローカルの検証とGitHubの表示も別です。

ベストプラクティス

  • dotfilesで共有するなら、helper内の秘密値・内部URL・include先や環境差を確認し、公開してよい内容だけにする。設定/資格情報ファイルを丸ごと公開しない
  • 仕事/個人のメールはlocalやincludeIfで使い分け、次のcommitの記録も確認する。設定しただけで誤混入を完全に防げるとはしない
  • OSSでnoreplyを使う場合もプロジェクトの方針と本人の公開範囲を確認する。全プロジェクトに一律に強制しない
  • セキュリティ重視なら GPG / SSH 署名を有効化
  • 新規initのbranch方針はチームで確認。init.defaultBranch変更は既存branchの改名ではなく、作者情報や認証とも別

FAQ

Q: 設定した email が GitHub に紐づかない
A: GitHubのcommitとのアカウント関連付けを確認します。認証に使ったアカウント名だけで作者情報は置き換わりません。通常の確認済みメールまたは自分の正確なnoreplyと、実commitのメールを照合してください。

Q: user.useConfigOnly = true は?
A: 作者情報を既定値から推測させず、設定する運用を助けます。ただし環境変数等の明示指定や、設定自体が誤っている場合まで防ぐものではなく、記録の最終確認は別です。

Q: 仕事の commit を間違って個人 email で push してしまった
A: まず今後使う設定と公開範囲を確認します。未共有の直近commitでもamendはcommit ID/署名を変える履歴変更です。既に共有した履歴へfilter/rebaseやforce pushを通常手順として勧めません。全ref/コピー・署名・CI・協業者への影響、退避/復旧と合意を含む個別計画が必要で、書換えだけで他者のclone等に残る情報が消える保証もありません。

関連

  • git config — 設定操作のメインコマンド
  • git commit --amend — 直近 author 修正
  • git filter-repo — 履歴書き換え(モダン)
  • GitHub Verified Commits — 署名による信頼性向上

新しい練習用repoだけで作者情報を確認する

BashとGit 2.28以降を使い、新しい空フォルダで実行します。identity-practiceが存在すれば何も変更せず停止します。自分の既存repoへ流用せず、例のメールは実ユーザーのものではありません。普段のglobal設定を変えず、この練習のlocal設定だけを作ります。

set -eu

# Bash/Git 2.28+: run in a new empty practice directory, not an existing project.
if [ -e identity-practice ] || [ -L identity-practice ]; then
    printf '%s\n' 'Practice path already exists; stop without changing it.' >&2
    exit 1
fi
git init --initial-branch=main identity-practice
git -C identity-practice config --local user.name "Example Author"
git -C identity-practice config --local user.email "author@example.invalid"
git -C identity-practice config --local user.useConfigOnly true
printf '# Identity practice\n' > identity-practice/README.md
git -C identity-practice add -- README.md
git -C identity-practice diff --cached --check
git -C identity-practice commit -m "Record example identity"
git -C identity-practice config --show-origin --show-scope --get user.email
git -C identity-practice log -1 --format='author=%an <%ae>%ncommitter=%cn <%ce>'

結果の設定元はこのrepoのlocalで、commitのauthor/committerのメールはともにauthor@example.invalidです。外部認証・署名・既存履歴の書換えを行う例ではありません。GIT_AUTHOR_*/GIT_COMMITTER_*等の環境指定や別設定がある場合は、同じ結果にならないことがあります。実行検証はそのような指定を除いた隔離環境で行っています。

過去の記録と今後の設定を分ける

作者は元の変更の著者、committerはそのcommitを記録した人で、cherry-pick等では異なることがあります。新しいuser.emailに変えても既存commitのメール/IDは変わりません。公開済みメールの扱いは公開先/コピーも含む別の検討で、設定変更やforce pushだけで情報が消えたと扱いません。

既存の設定元はgit config --show-origin --show-scope --get-all user.email、有効な設定値はgit config --get user.email、次の作者/committer候補はgit var GIT_AUTHOR_IDENT / git var GIT_COMMITTER_IDENT等で確認できます。いずれも個人情報を含むため、そのまま公開しません。--listの重複と有効値を混同せず、未設定の終了1を他の構文/設定読込エラーと区別します。

導入と接続はサーバーとクライアントのセットアップ、一般設定は設定の確認を参照。Gitの親ページの子ページから選択してください。

公式資料と検証範囲

2026年10月にGit設定のscope/includeIf/作者情報、worktree設定の条件、filter-branchの警告、GitHubのcommitメール、署名検証の条件と照合しました。新規repoのlocal設定と実commit、global/local/includeIf・一覧の重複、環境指定と過去commitの不変を隔離検証しています。GitHub上の実アカウント関連付け、GPG/SSH署名運用や履歴の一括移行を検証したものではありません。

子ページ

子ページはありません

同階層のページ
  1. 用語一覧
  2. エラー一覧
  3. git本体のインストール(Linux)
  4. Linuxサーバーへのgit導入とクライアントのセットアップ
  5. リモートリポジトリをローカルリポジトリとしてクローンする方法
  6. リモートとローカルのリポジトリを同期(pull)する方法
  7. 設定の確認
  8. gitユーザー名とemailの設定
  9. リモートリポジトリの作成
  10. ローカルリポジトリの作成
  11. 新規ファイル/ディレクトリをインデックスに登録
  12. インデックスの登録状態を確認
  13. ローカルリポジトリの変更をコミット
  14. コミット履歴の確認
  15. クライアントからリモートリポジトリの接続設定、確認、削除
  16. リポジトリへのプッシュ
  17. リモートリポジトリからクライアントへのSSHクローン
  18. リモートとローカルの差分表示
  19. バージョンの確認
  20. プロキシの設定
  21. ローカルをリモートリポジトリの状態に戻す
  22. ブランチの作成, 一覧表示, 切り替え
  23. ブランチのマージと削除
  24. リベース
  25. .gitignoreの書き方
  26. .gitignoreの設定が反映されない場合
  27. 特定のファイルをgitの管理から外す方法
  28. 参照(ORIG_HEAD, HEAD, FETCH_HEAD)
  29. git rm [-r --cached] の取り消し
  30. 一部のディレクトリ/ファイルのみをリポジトリから復元する方法
  31. ローカルとリモートリポジトリの有無を同期
  32. pushの取消し方法
  33. マージツールの起動方法
  34. Gitで「MERGING」の状態

最近更新/作成されたページ