🪴

GitHubの草が生えない(Contribution activity)

に公開

問題

ローカルでコミットをしてGitHubにpushしているのに、Contribution activityに反映されず「草が生えない」状態になっていた。

結論

コミットのメールアドレスが GitHub アカウントに登録されていないことが問題。

背景

  • macbookを2台所有し、場所や状況によって使い分けていた
  • それぞれの端末で異なるメールアドレスをGitのuser.emailに設定していた
  • 片方(macbook1)はGitHubに登録済みメールアドレス→Contribution activityに反映
  • もう片方(macbook2)は未登録のメールアドレス→Contribution activityに反映されなかった

解決のためにやったこと

1. GitHub のnoreplyメールアドレスの使用

username@users.noreply.github.comを使うとプライバシーを守りつつ、Contributionに反映できる

noreplyメールアドレスの確認方法

  1. GitHub にログインし、右上のアイコン → Settings を開く

  2. 左メニューから Emails を選択

  3. "Keep my email address private" にチェックを入れる

  4. Primary email address」の下に、GitHub が発行した noreply メールが表示される


2. コミット時のメールアドレスの確認

$ git log --pretty=format:"%h %ae"
6e54d59 username@users.noreply.github.com
161d8ad username@users.noreply.github.com
e1ebde1 username@users.noreply.github.com
3b983cc username@users.noreply.github.com
2c916c2 username@gmail.com
2e3f971 username@gmail.com
4a7448a username@gmail.com
  • git log:コミットログを表示するコマンド
  • --pretty=format:"...":ログの表示形式をカスタマイズ
  • %h:コミットハッシュ(短縮版)※
    例:6e54d59
  • %ae:→ Author Email(コミット時のメールアドレス)

3. コミット時のメールアドレスの確認・設定

コミット時のメールアドレス設定を確認する

現在のリポジトリ(ローカル設定)

git config user.email

グローバル設定(全リポジトリ共通)

git config --global user.email

定義している設定ファイルの確認

git config --show-origin user.email

コミット時のメールアドレスを再設定する

1. グローバル設定(PC全体で共通)を変更

git config --global user.email "123456789+username@users.noreply.github.com"
git config --global user.name "username" //ついでにユーザーネームの変更方法
  • すべてのリポジトリでこのメールアドレスが使われる
  • usernameと数字部分は 「GitHubのSettings > Emails」 で表示されたnoreplyアドレスに置き換える。

2. 特定のリポジトリだけ変更したい場合

git config user.email "199331470+username@users.noreply.github.com"
git config user.name "username"

3. 設定が正しく反映されたか確認

git config user.email
git config user.name

この時点でコミットすれば無事に草が生えました🌱

以下は過去のコミットもContribution activityに反映させたい場合の対処法を記載。


4. 過去のコミットのメールアドレスの変更

すでにpush済みの過去のコミットもnoreplyアドレスに統一したい場合は、rebaseを使って過去のコミットを1件ずつ編集する。
git filter-repo で一括置換も可能だが、今回は手動で対応した)

1. コミットログを確認

$ git log --pretty=format:"%h %ae"
a1b2c3d username@users.noreply.github.com
d4e5f6g username@users.noreply.github.com

2. 基点のコミットを指定してエディタを開く

編集したい最初のコミットの 1つ前 を指定:

$ git rebase -i "a1b2c3d^"
pick a1b2c3d ログイン画面のUIを改善
pick d4e5f6g 認証処理のバグ修正
pick h7i8j9k READMEに環境構築手順を追記
pick l0m1n2o CI設定ファイルを更新
  • "a1b2c3d^"<基点コミット>:編集したい範囲の1つ前のコミットを指定する。
    例:git rebase -i a1b2c3d^a1b2c3dの1つ前からHEADまでが対象)。

3. 変更したいコミットのpickをeditに変更する。

edit a1b2c3d ログイン画面のUIを改善
edit d4e5f6g 認証処理のバグ修正
pick h7i8j9k READMEに環境構築手順を追記
pick l0m1n2o CI設定ファイルを更新

保存(^X)する。

4. author を修正して rebase を進める

コミットごとに止まるので、以下のコマンドを入力する

git commit --amend --author="Your Name <your-email@example.com>"

このコマンドを実行すると、コミットメッセージを編集するためのエディタが開く。
メールアドレスだけ変えたい場合は、内容は変更せず保存・終了(^X)する。

そのあとで以下のコマンドを入力する。

git rebase --continue

これをコミットごとに繰り返す。

5. すべて終わったら、強制push

git push --force

補足: 主なrebaseコマンド

コマンド 意味
pick そのまま適用
edit コミット内容や author を修正
reword コミットメッセージだけ変更
squash 直前のコミットにまとめる
drop コミットを削除

5. rebaseの基礎理解

rebaseとは

  • git rebase は 過去のコミットを付け替え・編集するためのコマンド
  • とくに -i(インタラクティブモード)を使うと、履歴を1件ずつ修正・並び替え・統合できる

よく使うケース

  • author やコミットメッセージの修正(edit / reword
  • 不要なコミットの削除(drop
  • 複数のコミットをまとめる(squash

注意点

  • rebase は 履歴を書き換える操作なので、rebase後に push済みのブランチへpushする場合は--forceが必要
  • チーム開発でのpush--forceではなく --force-with-lease を推奨(他人の変更を誤って消さない)

学び

  • 複数端末で作業する場合は user.email を統一しておくことが大事
  • Contribution activity に反映される条件(デフォルトブランチ、GitHub登録済みメール)を学べた
  • noreplyメールは便利(プライバシー保護 & Contribution反映)
  • rebaseはコミット履歴を書き換える強力なツールである

Discussion