GitのAuthorを書き換えたい時に試すこと

## はじめに
先日、GitHubを見ると下記の画像のようなコミット履歴になっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900908/363e537f-318f-5929-00d5-88fa36daf813.png)

octcatになっている画像があります。
これは、コミットする際に自分のGitniメールアドレスを設定していなかったため、`Author`や`Comiter`に反映されていなかったためです。
このAuthorを書き換えるために大ハマりしたので、新たな犠牲者を出さないためにも今回はこれを直す手順をいくつか書いていきたいと思います。

##Gitの設定を見てみる
まず、以下のコマンドでGitの設定をみる事ができます。

```
$ git config --global --list
（略）
user.name=SeijiNumata(ユーザー名)
user.email=sample.seiji@gmail.com（メールアドレス）
（略）
```
ここが空欄になっていたりすると、`Author`や`Comitter`が空白となり、コミットの画像がoctcatになります。
設定するには、下記コマンドでできます。

```
$ git config --local user.name "ユーザー名"
$ git config --local user.email メールアドレス
```
これはプロジェクトをまたいだ全体の設定（グローバル）になりますので、ディレクトリだけに設定したい時は下記コマンドを実行しましょう。

```
$ git config --local user.name "ユーザー名"
$ git config --local user.email メールアドレス
```
これでpushをすると、**設定したあと**のコミットは`Comitter`を変更する事ができます。
しかし、過去のコミットの`Author`や`Comitter`を変更することはできません。

## 過去のコミットのAuthorとComitterを変更する

まず、下記コマンドで`Auhor`や`Comitter`がどうなっているのかを見てみましょう。

```
$ git log --pretty=full

commit 8952226c3ab88e520308dc06ac140c7fe01b0fc5
Author: SeijiNumata <>
Commit: SeijiNumata <>

    wc

commit e00b26e5e30d7283d31149a0dcb5407ca8b1ff37
Author: SeijiNumata <>
Commit: SeijiNumata <>

    make lscommand

commit c2cdd355838beca82c799929c320652a09f00c7d
Author: SeijiNumata <>
Commit: SeijiNumata <>


    #first commit
```
メールアドレスが空になっている事が確認できました。

***
**これを直すには、以下の３つの手順を実行すると良いです。**

①下記コマンドを実行

```
$ git rebase -i ＜コミットID＞
```
ここのコミットIDは、直したいコミットの一個前が良いです。
もしも直したいコミットが一番最初のコミットであるならば,

```
$ git rebase -i --root　＜コミットID＞
```
で一番前のコミットでも`rebase`する事ができます。

②　①のコマンドを実行すると、下記のような画面になります。

```
pick c2cdd35 #first commit # empty(コミットメッセージ)
pick e00b26e make lscommand(コミットメッセージ)
pick 8952226 wc # empty(コミットメッセージ)
```
ここで、直したいコミットの`pick`を`edit`にしてあげます。

```
edit c2cdd35 #first commit # empty(コミットメッセージ)
pick e00b26e make lscommand(コミットメッセージ)
edit ８952226 wc # empty(コミットメッセージ)
```
できたら、`:wq`で保存してあげましょう。

③下記コマンドを、editと書き換えた分だけ繰り返す

```
$ git commit --amend --reset-author
$ git rebase --continue
```
これで直る人は直ると思うので、`$ git log --pretty=full`で確認してみてください。

## 上記手順を実行しても変わらなかった時

rebaseのコマンドを実行し、pickをeditに変えるところまでは前までと同じです。
その後に、`$ git commit --amend --reset-author`の代わりに、下記コマンドを繰り返してみましょう。

```
% git commit --amend --author="ユーザー名 <メールアドレス>"
% git rebase --continue
```

## 上記手順を実行しても変わらなかった時②
コミットをするときに、`--allow-empty`というコマンドを実行して空のコミットをしていると、上記２つの手順でもAuthorを書き換える事ができません。
その時は、`rebase`,`pick→edit`までは同じように実行して、下記コマンドを繰り返すようにしましょう。

```
$ git commit --amend --author="ユーザー名 <メールアドレス> " --no-edit --allow-empty
% git rebase --continue
```
直ってるかどうか、`$ git log --pretty=full`で確認できます。
***
私はこの`--allow-empty`をつけるという事に気がつけなくて、とても時間がかかりました。
`% git commit --amend --author`をしているときに、

```
No changes
You asked to amend the most recent commit, but doing so would make
it empty. You can repeat your command with --allow-empty, or you can
remove the commit entirely with "git reset HEAD^".
```
このようなログが出ていたことに気がついたメンターさんに、
変更がない（No changes）→コミットにdiffがない→--`allow-empty`で試してみたらどう？
というご指摘をして頂き、なんとか解決する事ができました。。
**出力されたメッセージをしっかり読む**というのは、非常に大事な事ですね。
また、**バージョンなどを確認してgit本体の不具合を疑う**というのも解決アプローチとしてはあるというアドバイスも頂きました。


***
ここまでで今回の記事は終わりです。
少しでもお役に立てれば幸いです！
最後まで読んで頂き、ありがとうございました！！