[Git初心者向け] GithubやGitlabでcommit時のメールアドレスは大切なんだという話。

git configで設定するメールアドレス、~~~@example.comとか適当なアドレスを設定していませんか？。
コードをcommitする場合自分のユーザーに紐づけた正しいメールアドレスでcommitしましょうというお話です。

# commitのauthorの同一性の判定

　下の画像はGithub上のとあるリポジトリのmasterブランチへのcommit一覧です。表示されている二つのcommitは`k8shiro`というユーザーによって作成されました。当然ですが、Github上でも正しく同一ユーザーのcommitとして認識され、かつGithubのアカウントとcommitのauthorが正しく紐づいているので熊のアイコンが表示されています。

![commit01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/f8961e1a-fddf-5313-79dd-6f703f9cb599.png)

これは正しいauthorと正しいメールアドレスでcommitされているのでGithubも正しく認識できています。

このGithubのユーザーとcommitの紐づけは、Githubにpushする時に認証に使用したユーザーではなく、__commitに設定されるメールアドレス__により判定されています。

# 実験
　それでは、正しくないauthor・メールアドレスを使用するとどうなるか見てみましょう。

## メールアドレスが違う場合 (authorは正しい)

　メールアドレスに間違ったもの(k8shiro@example.comという架空のアドレス)を指定しました。`k8shiro committed 1 minutes ago`となっていて文章としては正しそうに見えますがアイコンが灰色のOctoCatになっていて、アイコンをクリックしてもGithubの`k8shiro`のユーザーページには飛べません。

![commit02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/13cd0771-0f16-78b4-371e-37ca07b7c226.png)

## authorが違う場合 (メールアドレスは正しい) 

　続いて、間違ったauthorを指定した場合も実験します。今回は`test_user`というauthorを指定しました。
結果は以下のようになり、authorは間違ったものを指定したにも関わらず`k8shiro`ユーザーのcommitとして表示されています。

![commit03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/b68eac86-d37b-7a4b-c41a-cf9091d3af7e.png)

しかしながら`git log`コマンドで確認すると`Author: test_user`となります。

```
commit 5095a0aeb824f39f3a25813edfbc329d12e4df15 (HEAD -> master)
Author: test_user <******@******>
Date:   Tue Nov 19 03:36:08 2019 +0000

    sample commit 03

commit 24fe47183f0afdd355b58cde8c4e885798384a92 (origin/master, origin/HEAD)
Author: k8shiro <k8shiro@example.com>
Date:   Tue Nov 19 03:27:48 2019 +0000

    sample commit 02

commit 026f9716911494dbdaa696cbb1eefe2c1b37ced7
Author: ****** **** <******@******>
Date:   Tue Nov 19 12:11:53 2019 +0900

    sample commit 01

commit 5a715633f9cbf626aeefa9eeb73b7dc5a6ef4f02
Author: ****** **** <******@******>
Date:   Tue Nov 19 12:08:53 2019 +0900

    Initial commit
```
## 他人のメールアドレスの場合

　最後にGithub上に存在するユーザーのアドレスをcommit時に指定してしまった場合です。今回は`ko-he-2`というユーザーのアドレスを指定してしまいました。その結果が下の画像です。


![commit04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/d18cba69-0c05-a9ba-ff8c-d48a1896cfeb.png)

commitやpushの操作や認証を`k8shiro`が実行していても、`ko-he-2`のcommitと認識されています。


# なぜcommitのauthorが重要なのか

　チームで開発している場合、他人の書いたコードの意図がわからないことは起こり得ます。この時にcommitの履歴をたどりコードのauthorに質問することになります。また、これ以外にも

- リポジトリの開発者やcommit等の状況

![insights01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/d1cf8d22-30b3-bc57-6209-3c05f679b150.png)

- commiterとcommit量

![insights02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/8a931b6c-5c2e-1494-5168-9ac25dc8fb95.png)

- ブランチのネットワーク状の可視化

![insights03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/ebadaa31-0be8-0dd4-8bbe-43e9abc66d58.png)

等Githubが提供してくれる統計情報を見るときにも使用されます。

# authorとメールアドレスの設定の仕方

## サーバー全体(ログインユーザー)に設定する場合
自分の開発サーバーにgitをインストール後に以下を実行すれば、cloneしてきたリポジトリでcommitする場合は以下のコマンドを実行します。

```
# 適当な場所でgit config --global

git config --global user.name "ユーザー名"
git config --global user.email メールアドレス
```

## 特定リポジトリのみauthorとメールアドレスを指定する場合

cloneしてきたリポジトリだけauthorとメールアドレスを変更したい場合は以下のコマンドを実行します。(https://github.com/k8shiro/test_repoをcloneする場合)

```
# clone後リポジトリ内でgit config --local

git clone https://github.com/k8shiro/test_repo
cd test_repo
git config --local user.name "ユーザー名"
git config --local user.email メールアドレス
```

## 特定のcommitのみauthorとメールアドレスを変更する場合
あるcommitに対しauthorとメールアドレスを指定することもできます。この場合、この後のcommitではデフォルトのauthorとメールアドレスに戻ります。

```
git -c user.name='ユーザー名' -c user.email='メールアドレス' commit -m 'コミットメッセージ'
```

# まとめ

GithubやGitlabのアカウントと、commitのauthorの紐づけはcommitに入るメールアドレスにより判定していることを解説しました。
このアカウントとcommitのauthorの紐づけはコードの変更履歴をたどる上で重要であり、また、様々なGithubやGitlabが提供する統計情報にも使用されているため、正しいものを使用するようにしましょう。