GitHubのユーザー名を変更するとnoreplyメールアドレスのコミット履歴はどうなるのか？

# はじめに
魔が差して、GitHubのユーザー名を変えたんですよ。
そしたら、過去のコミット履歴が全部自分のアカウントと切り離されちゃったので、
慌てて元に戻したんですよ。
そこから始まる新しいStory, Just for you

# どうしてこうなった？
僕は一番最初にGitHubにpushした時から、`user.email`として「noreplyメールアドレス」を使ってて、
リアルなメールアドレスでは一度もpushしてません。
[AuthorのメールアドレスをGitHub用のアドレスに変更する](http://te2u.hatenablog.jp/entry/2014/09/18/140426)

GitHubユーザー名は`TheRed`なので、noreplyアドレスは`TheRed@users.noreply.github.com`になります。
ユーザー名を変更すると、元の`TheRed`アカウントは解放されて誰のものでもなくなるので、
`TheRed@users.noreply.github.com`のコミット履歴も誰でもなくなっちゃうんですね。。
当然といえば当然。

そこは許容するとしても、次に誰かが`TheRed`アカウントを取得してしまったら、
僕の過去のコミット履歴が全部他人の顔に変わってしまうんじゃないか？？
というのを一番危惧してしまい、一旦元に戻しました。

おそらく、noreplyではなく本物のメールアドレスを`user.email`にしてる人が多いはず。
その場合はGitHubのユーザー名を変えてもメアドに影響ないので、この問題は発生しないのでしょう。
検索しても日本語では情報見つかりませんでした。

なんか興味あったので色々と試してみると、面白いことが分かってきたので、
以下にGitHubの挙動と未来への希望をまとめておきます。

# noreplyメールアドレスの仕様変更
実は上に貼った記事は2014年の古い情報で、今はこんな仕様に変わってます。

> GitHubでnoreplyとして認識されるメールアドレスは、
・2017/06/18より後にアカウントを作成した場合は "7桁のID+ユーザー名"
・2017/06/18より前にアカウントを作成した場合は "ユーザー名"
これに @users.noreply.github.com を付けたものになります。

[GitHubのメールアドレスが漏れる？コミット時のメールアドレスにnoreplyを設定](http://ryoichi0102.hatenablog.com/entry/2017/10/12/000713)

去年の6月に変わったんですね。
僕が初回登録したのはもっと前なので"ユーザー名@"になってたんですが、
今回一度ユーザー名を変えて戻したタイミングで、メアド変わってました！
今は `4494300+TheRed@users.noreply.github.com` となっております！

# GitHubの挙動を実験

テスト用のGitHubアカウントをもう一つ持っていたので、
そっちのアカウントを変更しつつ、コミット時のメアドも変更しつつ
いくつか試してみました。

アカウント名は`hosoiri-villager`で、去年登録したので
noreplyアドレスは既にこの形式でした。
`32363877+hosoiri-villager@users.noreply.github.com`

このアカウント名を`ioridani`に変更してみたところ、
noreplyアドレスの番号部分は変わらず！
「ユーザーID」みたいな扱いなんでしょうね。
`32363877+ioridani@users.noreply.github.com`

ローカルで`git commit`するときに、`user.email`を切り替えながら
数パターンやってみた結果がこちら。

| メールアドレス            | GitHubで認識されるユーザー |
| -------------------------- | -------------------------- |
| 4494300+TheRed@            | TheRed                     |
| TheRed@                    | TheRed                     |
| 32363877+ioridani@         | ioridani                   |
| 32363877+hosoiri-villager@ | ioridani（自動変更）       |
| hosoiri-villager@          | (見つからず)              |

なるほど、"7桁のID+ユーザー名"のメアドでコミットされていれば、
ユーザー名を変更する前のコミットも自動的に紐づいてくれるんですね！
ID次第ってことなのですな。

実際のGitHub履歴とローカル`git log`のキャプチャも晒しておきまーす。
https://github.com/TheRed/change-username-test/commits/master
<img width="1009" alt="スクリーンショット 2018-07-08 0.49.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/24333/dc180121-4ada-8afb-12fe-cd49a7759f98.png">

<img width="751" alt="スクリーンショット 2018-07-08 0.49.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/24333/3a786d2e-23dc-4263-b5b8-d7a5289d0677.png">

# ユーザー名を変更できそうな新たなる希望
今は`TheRed`ユーザが存在するからどっちでコミットしてもOKだけど、
この状態でユーザー名を変えると`4494300+TheRed@`だけは生き残るはず。
ってことは、

- 今日以降`4494300+TheRed@`を`user.email`にした状態でガシガシコミットしていく
- メジャーなリポジトリの履歴から`TheRed@`が埋もれた頃にユーザー名変更
- 過去分のコミットは潔く諦める
- 新しく`TheRed`ユーザーが登録されても`xxxxxxx+TheRed@`でコミットしてくれれば自分には影響なし

で混乱なく移行できそうな感じです！
まだMergeされてないプルリクとかあるので、
現時点ではそっとメアドだけ変更して寝かせておくことにしまーす:smile:

# 追記：ユーザー名変更しました！
2018/07/09に検証してこの記事を公開。3ヶ月間寝かせて、
2018/10/15にユーザー名を変更しました！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">GitHubのユーザー名を「TheRed」から「the-red」に変えてしまいましたー！<a href="https://t.co/4YMHqnroTU">https://t.co/4YMHqnroTU</a></p>&mdash; Hisaki Akaza (The Red) (@the_red315) <a href="https://twitter.com/the_red315/status/1051827597879828480?ref_src=twsrc%5Etfw">2018年10月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

コミット履歴を見ると、6月11時点では旧アカウント、8月9日以降は新アカウント扱いにちゃんとなっておりますね！想定通り :thumbsup:
https://github.com/goqoo-on-kintone/goqoo/commits/b36f0b957819e60791fce402f2367df2a029615d

# 追記：旧ユーザー名が他の人に登録された結果…

最初に書いたこの危惧が、現実になってしまいました。。。

> 次に誰かがTheRedアカウントを取得してしまったら、
僕の過去のコミット履歴が全部他人の顔に変わってしまうんじゃないか？？

![CleanShot 2023-09-22 at 14.31.18@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24333/43d3f127-3309-8249-72d2-fc669090eccc.png)

過去のコミット履歴に出てくる「thered」というユーザーをクリックすると別人のプロフィールが出るようになっちゃいました。たまたま以前の僕とハンドルネームが同じな、僕とは無関係の人です。
`TheRed@users.noreply.github.com`でコミットしていた時代のログが、軒並み別人に置き換わってしまいました。

これは気持ち悪いなぁ。。。そしてこの人にも迷惑かけちゃってるよなぁ。。。ごめんね。
でも昔のをコミットを全部[filter-branch](https://git-scm.com/docs/git-filter-branch)するのも嫌なので、これで仕方ないと思うことにします :sob: 
2018年の8月時点で気づいたので、まだ影響範囲は少なくて良かったです。

ではまた〜。