GitHubで草の生えてる部分が少ないことに気づいてからの奮闘記

# はじめに
プログラミングスクールでの学習の際、「Githubで草を生やす意識をしましょう。」と聞き、改めてGithubのコントリビューション（行動履歴）を確認してみました。

![Githubのコントリビューション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/8b76b879-1421-cab6-6f84-8df38ed4f390.png)


そうすると、草は生えていると思っていたけれどなんだか思ったより少ないような…？
記録されていた内容を確認したところ、どうやら新しくリポジトリを作成したときや、Issuesを書く練習をしてみたときなどの行動履歴が記録されているよう。

肝心のコミット履歴が見当たらず、何かがおかしい…と思い、調べてみることにしました。

# わたしの試行錯誤の過程
結論として、今回の問題を解決するために私が行ったことは、

___1.Gitのローカル上でのメールアドレスとユーザー名の設定
2.ログに残っても問題ないようにメールアドレスをダミーのアドレスに変更
3.過去にコミットしたログのメールアドレスを上書きすることでGithubに履歴を反映___

になります。
ここからは調べつつ悩みながら作業した際の記録になっているので、戻ったりやり直したりなどの過程もあります。
また、共同での開発などもしておらず、まだ自分だけの環境だったため無理やりデータを書き換えたりしている場面もありますのでご了承ください。

## 1.草が生える条件とは？
調べたところ、コントリビューション（GitHub上での行動履歴）…いわゆる「草を生やす」行動履歴の種類はいろいろあるようです。

https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-github-profile/managing-contribution-settings-on-your-profile/viewing-contributions-on-your-profile

>* リポジトリの既定のブランチまたは gh-pages ブランチへのコミット
>* ブランチの作成
>* イシューのオープン
>* ディスカッションをオープンすること
>* ディスカッションに回答すること
>* プルリクエストを提案すること
>* pull request レビューの送信

私の場合は1人での作業でブランチも特に分けておらず、単純にコミットの記録が反映されていなかったので、やはりGithubに上手く記録が残せていないことが分かります。
表示されない理由は何なのでしょうか？

https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-github-profile/managing-contribution-settings-on-your-profile/why-are-my-contributions-not-showing-up-on-my-profile

> コミットは、次のすべての条件を満たしている場合にコントリビューション グラフに表示されます。
>* コミットに使用されたメール アドレスが、GitHub.com のアカウントに関連付けられている。
>:

こちらで気になる記述を発見しました。
また、調べていると、メールアドレスとユーザー名を登録していなかったという方の記事も複数見かけたので、こちらが原因の可能性が高そうです。

## 2.ローカルの環境で設定しているメールアドレスを確認する
ターミナルにて以下のコマンドを実行します。
```
$ git config --global user.email
```
そうすると…何も表示されません。
初心者のためこの段階で戸惑ってしまったのですが、どうやら表示されないということはそもそも登録されていないとのこと。

Gitの登録時はよく分からないまま進めていたので、自分がメールアドレスを登録しているかどうかすら分かっていませんでした…。
```
$ git config --global user.name
```
上記のコマンドでユーザー名も確認してみたところ、何も表示されません。
どうやらこちらも登録していなかったようです。

確かにローカルでの作業環境で、自分が何者かを設定していなければGithubに記録をアップした時も反映されないのは当然ですね…。

## 3.メールアドレスをローカルの環境で設定する
作業環境でのメールアドレスやユーザー名の登録は簡単です。

先ほどと同じコマンドの後ろにメールアドレスを追加して実行…
```
$ git config --global user.email Githubに登録したメールアドレス
```

確認として再度以下のコマンドを実行すると…、
```
$ git config --global user.email
実行結果
Githubに登録したメールアドレス
```
というように、先ほど入力したメールアドレスが表示されました。

ユーザー名も関係しているのかは詳しく確認していませんが、念のため同様に設定しておきましょう。
登録して…、
```
$ git config --global user.name Githubのユーザー名
```
確認…。
```
$ git config --global user.name
実行結果
Githubのユーザー名
```
これで設定が完了しました！

試しにプッシュしてGithubのコントリビューションを確認すると…草が生えています！

緑色に変わった今日の日付の記録を確認すると、「commits」の文字が見えます。
コミットもしっかり記録されたようでひと安心です。

ただ、ここで少し疑問が生まれます。
プッシュの前に「$ git log」で確認した際に自分のメールアドレスが記録されていました。
これは問題ないのでしょうか？

再び調べ始めます。

## 4.結論、ダミーのメールアドレスを登録する
調べた結論から言うと、そもそもGithubが自分のメールアドレスを登録しなくても済むようにダミーのアドレスを用意してくれているようです。

正直、ログからアドレスがどのように確認できるかもまだいまいち分かっていないのですが、ひとまずログには残さない方が良さそう。
先ほど登録してしまいましたが、ダミーのメールアドレスを登録し直すことにしましょう。

### まずは、Githubでダミーのアドレスを取得

ダミーのアドレスは、GitHubの設定画面から確認することが出来ます。
GitHubにログインして、自分のアイコンをクリックして開いたタブから「⚙Setting」をクリック。
左ナビに「✉Emails」があるので、ここをクリックします。

開いた画面の少し下の方に「☑Keep my email addresses private」というチェック項目があるので、チェックが入っていない場合はチェックを入れます。
そうすると
「ユーザー名@users.noreply.github.com」もしくは
「ID+ユーザー名@users.noreply.github.com」というようなダミーのメールアドレスが表示されます。

### 改めて、作業環境でメールアドレスを変更

このメールアドレスを先ほどと同じ手順でローカルの環境に登録しておきましょう。
```
$ git config --global user.email ユーザー名@users.noreply.github.com
```
これでメールアドレスの設定が完了です。

試しにプッシュをしてから、GitHubでリポジトリを開き、コミット履歴を開いてみると…先ほどメールアドレスを変更した履歴に自分のアイコンが表示されています！
※イメージ
![gitの草03-a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/aa8780a4-d964-42bb-695f-4541ef3abfb7.png)

きちんとダミーのメールアドレスで紐づけできているようです。
紐づけされているのが分かりやすくて助かります。

ですが、またまた困ったことに以前の履歴が別人として認定されているという問題が…。

ここからは、過去のコミット履歴に紐づけたメールアドレスを変更する方法がないか探ってみることにします。


## 5.過去にコミットした際のメールアドレスをGithubと紐づいたメールアドレスに変更
実際に私がやってみた方法について順を追って記録します。

### まずは、Githubを開いて履歴を確認します。

Githubにログインして、自分の作った「Repositories」の一覧を表示。
この機会に全て修正しておきたいので、上から順番に確認しながら作業していこうと思います。

なので、1つずつ個別のURLを開いて「Commits」の一覧を表示してみます。

![コミット履歴のアイコン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/9054dc71-f7e7-5892-c30f-169d1ce35855.png)

確認するとアイコンも表示されておらず、私のアカウントが紐づけされていないことは間違いないようです。

### それでは、自分の作業環境に移動して履歴の修正を行っていきます。


まずは、変更したいフォルダに移動して、念のため変更しようとしているリポジトリが合っているか、リポジトリ名を確認してみましょう。
```
$ git remote -v
実行結果
origin  git@github.com:ユーザー名/リポジトリ名.git (fetch)
origin  git@github.com:ユーザー名/リポジトリ名.git (push)
```
私の環境ではこんな感じの表示になっていました。

リポジトリ名も間違いなかったので、調べて見つけてきたコマンドを利用して、履歴を書き換えていこうと思います。

使用したコマンドはこちら…
```
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME=ユーザー名; GIT_AUTHOR_EMAIL=メールアドレス; GIT_COMMITTER_NAME=ユーザー名; GIT_COMMITTER_EMAIL=メールアドレス;" HEAD
```
ここで注意したいのが、このコマンドの意味です。

:::note warn
--env-filter：gitの「環境変数」を書き換えるためのコマンド
filter-branch：Gitの「リポジトリ内の歴史」を変更するための「強力」なコマンド
:::

>歴史を書き換える方法がもうひとつあります。これは、大量のコミットの書き換えを機械的に行いたい場合 (メールアドレスを一括変更したりすべてのコミットからあるファイルを削除したりなど) に使うものです。 
そのためのコマンドが filter-branch です。これは歴史を大規模にばさっと書き換えることができるものなので、プロジェクトを一般に公開した後や書き換え対象のコミットを元にしてだれかが作業を始めている場合はまず使うことはありません。

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88#:~:text=%E6%9C%80%E5%BC%B7%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%3A%20filter%2Dbranch

そしてさらに、「git filter-branch」の後に付けられた「-f」…

:::note warn
※-fオプションは「force」（強制）の意味。
このオプションは、Gitの操作を強制的に実行するために使用されます。
:::

分かりますでしょうか？
このコマンドは強制的に書き換えを実行するため、場合によっては注意が必要になるようです。
そして、この後ろの""内で指定したのが環境変数。

>GIT_AUTHOR_NAME は “author” フィールドに使用される、人間に読める形式の名前です。
GIT_AUTHOR_EMAIL は “author” フィールドで使用するメールアドレスです。
GIT_COMMITTER_NAME は “committer” フィールドで使用する人名です。
GIT_COMMITTER_EMAIL は “committer” フィールドで使用するメールアドレスです。

https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0#:~:text=%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,GIT_AUTHOR_NAME,-%E3%81%AF%20%E2%80%9Cauthor%E2%80%9D%20%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89

最後の「HEAD」は現在使用しているブランチの先頭を表しています。
つまり、現在のブランチの履歴を強制的に書き換えてしまうようです。

私の場合は、自分の練習用のデータが入っているだけなので、何があっても自己責任ということでこのコマンドを使わせていただきました。
それではこちらを実行…すると、
```
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME=ユーザー名; GIT_AUTHOR_EMAIL=メールアドレス; GIT_COMMITTER_NAME=ユーザー名; GIT_COMMITTER_EMAIL=メールアドレス;" HEAD
実行結果
：
：
Cannot rewrite branches: You have unstaged changes.
```
何やら数行表示された後にこんなメッセージが表示されました。
___「ブランチを書き換えることはできません: 変更がステージングされていません。」___
とのこと。

ここがまだいまいち理解できていないところなのですが、

>コミットとは、ファイルやディレクトリを追加・変更・削除したという情報を、リポジトリに記録する操作のこと。

ということは…

「git filter-branch -f --env-filter」で環境変数を書き換えようとしたけど、まだその作業自体はワークツリーの中にある。

「$ git commit」でコミットして初めて「リポジトリ内の歴史」を変更するfilter-branchが使えるようになる…みたいな…？
まだ推測の段階なので確かなことは言えないのですが、試しにコミットして、
```
$ git add .
$ git commit -m "[Check]ログの修正"
```
先ほどのコマンドを再度実行すると、
```
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME=ユーザー名; GIT_AUTHOR_EMAIL=メールアドレス; GIT_COMMITTER_NAME=ユーザー名; GIT_COMMITTER_EMAIL=メールアドレス;" HEAD
実行結果
：
：
Rewite ・・・・・・
```
「Rewite ……」という実行結果が返ってきました！
どうやら変更に成功したようです。
確認してみます。
```
$ git log
```
でログを確認すると…
```
Author: ユーザー名 <Githubと紐づいたダミーのメールアドレス>
```
Author（著者）の部分にユーザー名とメールアドレスが確認できました！
最後にプッシュをして…

```
$ git push -f origin main
```
完了です。
※こちらもメールアドレス変更時と同様に無理やりプッシュするために「-f」を付けています。

### それでは、Githubの履歴を確認してみましょう。

先ほど確認用に開いていた「Commits」履歴の一覧ページを更新してみると…
※イメージ
![gitの草03-b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/c6680215-868f-44d0-58c2-d6ae83d75c3a.png)
アイコンとユーザー名が表示されました！

自分のプロフィールから草が生えているかも確認してみます。

![コントリビューション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/271855d9-920d-dd0e-9864-e0c32ece3317.png)

履歴を書き換えた部分の草が増えていました。
空いている部分は何だろうと思って、学習記録を確認したところ、確かにGitを使わずに作業していた日だったので記録としては問題なさそうです。


# さいごに
チームでの開発をまだ行ったことがなく、Gitの仕組みについて触れることも少ない中ですが、今回の作業過程でGitについて調べたことで少しずつ分かってきたような気がします。

どうしてもプッシュが上手くいかないときに、今回のような「-f」のオプションを付けて無理やりプッシュしてしまうこともあるのですが、共同作業になるとそうもいかないので、今のうちに理解を深めていきたいです。