Git/GitHubでやってもた!コミット作者が別アカになってたのを直した話

こんにちは、さるまりんです 🐒

GitHubにリポジトリを公開して、
「よし、いい感じに置けたぞ」と思っていたある日。

ふとコミット履歴を見て、こうなりました。

……あれ?作者、別アカじゃない?

メインで使っているGitHubアカウントとは別の、
サブアカウント用に作ったプロジェクトでした。

今回は「サブアカウント名義で公開したい」リポジトリだったので、
コミット作者もサブアカウントになっている想定でした。

SSHもちゃんと設定したし、
pushも通ってるし、
リポジトリも正しい。

なのに、コミットの Author が、別アカウントになっている

どうやら
GitHubのアカウント切り替えに気を取られていて、
Gitの author 情報までは切り替わっていなかったようです。

今回は、この
「Git/GitHubでやってもた!」をどう直したか、
そして 同じMacで複数アカウントを安全に使うためにどう整理したか
をまとめてみます。

起きていたこと(結論から)

まず結論です。

  • GitHubアカウントは切り替わっていた
  • でも Gitの author 情報は切り替わっていなかった
  • その結果
    👉 別アカウント名義のコミットが積まれていた

これ、かなり「あるある」だと思っています。

まずは落ち着いて状況確認

焦る前に、まずは現状を確認します。

リモートはどこを向いている?

git remote -v

例:

origin git@github-sub:my-sub-account/my-funny-project.git (fetch)
origin git@github-sub:my-sub-account/my-funny-project.git (push)

👉 SSHの接続先は問題なさそう

このリポジトリの author 設定は?

git config --get user.name
git config --get user.email

例:

Main User
main@example.com

……はい、ここですね。

グローバル設定も確認

git config --global --get user.name
git config --global --get user.email

例:

Main User
main@example.com

ここでようやく、

あ、グローバルがメインアカウントのままだ

と気づきました。

このリポジトリだけ author を切り替える

まずやったのは、このリポジトリ限定での設定変更です。

git config user.name "my-sub-account"
git config user.email "123456789+my-sub-account@users.noreply.github.com"

確認:

git config --get user.name
git config --get user.email
my-sub-account
123456789+my-sub-account@users.noreply.github.com

👉 これで、これからのコミットはOK

……ただし。

問題は「すでに積まれたコミット」

履歴を見てみると。

git log -1 --pretty=full
Author: Main User <main@example.com>
Commit: Main User <main@example.com>

過去のコミットは直っていません。

ここが今回のメインイベントです。

方針:履歴を書き換える(慎重に)

今回は、

  • 公開したばかり
  • 他に利用者はいない
  • mainブランチのみ

という状況だったので、
履歴を書き換える判断をしました。

⚠️ 注意ポイントです。

  • すでに共有されているリポジトリ
  • 他の人が clone / fork している場合

こういうケースでは、
基本的にやらない方がいいです。

今回は「間に合った」パターンですね。

念のためバックアップを作る

安心して作業するために、まずはバックアップ。

git branch backup/before-author-fix

地味ですが、
この一手があるだけで心の余裕が違います。

ルートから rebase する

git rebase -i --root

エディタが開くので、
すべての pick を edit に変更して保存します。

すると、最初のコミットで止まります。

Stopped at xxxx... Initial commit
You can amend the commit now

各コミットで author を差し替える

止まるたびに、これを実行します。

git commit --amend --reset-author --no-edit
git rebase --continue

これを すべてのコミット分、繰り返します

終わったら確認。

git log --pretty=full -3

すべてが

Author: my-sub-account <123456789+my-sub-account@users.noreply.github.com>
Commit: my-sub-account <123456789+my-sub-account@users.noreply.github.com>

になっていればOK。

……世界線、戻りました。

リモートへ反映(慎重に)

履歴を書き換えているので、
普通の push はできません。

git push --force-with-lease origin main

ここで --force-with-lease を使います。

  • --force より安全
  • 予期しない上書きを防いでくれる

結果

GitHubのコミット履歴を見ると……

  • 全コミットが my-sub-account
  • 作者アイコンも一致
  • 気持ちがスッとする

正直、

「やっと外に出せた」

という感覚でした。

出せたと思ったのは、ちょっと早かったみたいですが。

今後混ざらないための運用メモ

今回の反省をまとめます。

1. リポジトリごとに user を設定する

git config user.name
git config user.email

2. SSH Host を分ける

Host github-sub
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_sub

3. push前にこれを見る

git log -1 --pretty=full

これだけで、事故率はかなり下がります。

Gitは正直、GitHubは優しい

今回あらためて思ったのは、

  • Gitは正直(設定どおりに動く)
  • GitHubは優しい(ちゃんと直せる)

ということです。

Gitは、こちらが設定したことを
良くも悪くも、そのままやってくれます。

だからこそ、

「できたものは、できるだけ優しくしたい」

そんな気持ちになりました。

やってもた体験は、
この先の誰かの助けになります。

僕と同じように
「……あれ?」となった人の助けになれば嬉しいです。

読んでくださってありがとうございました。
それではまた!! 🐒