プログラミング始めた頃に知りたかったGitHubの草生やし方法

# 背景 #
「プログラミング始めたばかりの頃の自分に、一つアドバイスするとしたら何だろう？」

というのを、ふと何となく考えて（私もまだまだ初心者中の初心者ですが）、その答えが「GitHub上で草の生やし方をまず勉強しとく」だったので、自分の復習もかねてメモしておきます。

実は、始めたばかりの頃は、Gitの存在を知らなくて長らく学習したことの記録が客観的に残らない形になっていたので、すごくもったいないことをしていました（苦笑）

なお、前提として、ここで整理する「草の生やし方」は、リモートリポジトリへのコミットに限定していますので、Issueなどでの草生やし（コントリビューション）方法は出てきません。

# Gitとはなにか #
復習もかねて…

Gitは一言でいうと「変更履歴を管理するシステム」です。
作成・変更したファイルの更新履歴を保存・追跡できるので、「あ。今日ここ更新したけど、2日前の状態に戻したい！」と仮になったとしても、ファイルを編集前の状態に戻したりすることができます。

詳しくは [サル先生のGit入門]("https://backlog.com/ja/git-tutorial/intro/01/) が定評あるかと思います。
（私も改めて読み直してまた勉強になりました）

あと英語がわかる方だったら、NetNinjaさんのGit & GitHub Tutorial for Beginnersも、わかりやすかったです。

<iframe width="560" height="315" src="https://www.youtube.com/embed/3RjQznt-8kE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


#「草を生やす」ってなんのこと？ #
はじめて見た時にすごく違和感だった「草を生やす」という表現…
初見だと「何のこと？？」となるんですが**「草」＝「コントリビューション」**です。

コントリビューションは日本語にすると「貢献」なので、どれだけGitHubに貢献したかを表す指標、ということですね。

GitHubというのは、Gitのリポジトリ（後述）をホスティングできるサービスのことで、GitHubを利用することで、ネットワーク上で開発者同士がソースコードやその変更履歴を共有・公開することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215197/6b975592-88d4-a970-fe33-1f5a6f436d7c.png)
上図はGitHubのコントリビューション・カレンダーと呼ばれるもので、コントリビューションがつくと緑色になって、草が生えてるように見えるから、草と呼ぶそうです。

草を生やす理由はいろいろあると思いますが、こんなところになるかと思います。
　1. 学習・アウトプットの成果が可視化できるので、モチベーションが上がる
　2. 草を生やすにはアウトプットが必要なので、アウトプットを意識した学習習慣が自ずと身につく
　3. 学習・アウトプットしたことの客観的示せるので、転職活動をする場合、草生やしはほぼ必須になる

### 草が生える条件 ###
[GitHub Docs](https://docs.github.com/ja/github/setting-up-and-managing-your-github-profile/viewing-contributions-on-your-profile) にある通り、コントリビューションにカウントされる対象（≒何によって草が生えるか）は、大体以下の4つになります：

1. リポジトリのデフォルト・ブランチ or gh-pagesブランチへのコミット
2. イシューを開く
3. プルリクエストを提案する
4. プルリクエスト・レビューの提出

ここでは、1つ目に絞って具体的な方法を整理していきたいと思います。

### "コミットで草を生やす"上で、理解しておきたい用語 ###
まず、草の生やし方の前に、用語の定義をクリアにしておきたいと思います。

|用語  |定義  |
|---|---|
|リポジトリ　　　|ファイルやディレクトリの状態を記録する場所。保存された状態は、内容の変更履歴として格納されている|
|リモートリポジトリ　　　|専用のサーバに配置して複数人で共有するためのリポジトリ。GitHubで作成したリポジトリはリモートリポジトリ。自分がローカルリポジトリで作業した内容をリモートリポジトリにアップロード（プッシュ）したり、リモートリポジトリから、他の人がアップロードした作業内容を自分のローカルリポジトリにダウンロード（プル）できる。|
|ローカルリポジトリ|ユーザ一人ひとりが利用するために、自分の手元のPC上に配置するリポジトリ  |
|ワークツリー（ワーキングディレクトリ）　|実際に作業をしている、Gitの管理下に置かれたディレクトリのこと|
|コミット|ファイルやディレクトリの追加・変更を、リポジトリに記録する操作。コミットは時系列順につながった状態でリポジトリに格納されており、最新のコミットからたどることで、過去の変更履歴やその内容を知ることができるようになっている  |
|インデックス（ステージングエリア）|リポジトリとワークツリーの間に存在し、リポジトリにコミットする準備をするための場所のこと。コミットでファイルの状態を記録するには、まず「git addコマンド」でインデックスにファイルを登録する必要がある。これにより、ワークツリー内の必要ないファイルを含めずにコミットしたり、ファイルの一部の変更だけをインデックスに登録してコミットすることができる|
プッシュ　|リモートリポジトリ内の変更履歴をローカルリポジトリの変更履歴と同じ状態にする操作。自分の手元のローカルリポジトリの変更履歴を、リモートリポジトリに共有するには、ローカルリポジトリ内の変更履歴をアップロードする必要があり、これを行うのがプッシュ|
ブランチ　|履歴の流れを分岐して記録していくためのもの。分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができる|

※定義は、基本的に [サル先生のGit入門]("https://backlog.com/ja/git-tutorial/intro/01/) から拝借させていただいてます。
※Git/GitHubを利用する上で知っておくべき用語はもちろん、もっとたくさんありますが、ひとまず「リモートリポジトリへのプッシュで草を生やす」場合に理解しておいた方がいい用語に絞っています。


# いよいよ草を生やしてみる #

**前提**
(1) Gitはインストールできている（インストール方法は、[こちら](https://backlog.com/ja/git-tutorial/intro/05/)）
(2) GitHubのアカウントが作成できている

### 1. 自分のPC上に作業用フォルダ・ファイルを作成 ###

```Ruby:ターミナル
mkdir test                     #例：testという名前のフォルダ(ディレクトリ）を作成
touch hello.txt                #例：hello.txtという名前のファイルを作成
```

### 2. GitHub上にリモートリポジトリを作成 ###
GitHubにログインし、画面右上の 「```＋```」 から「```New Repository```」を選択
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215197/2be1831a-0e6f-48f7-2d03-b28acac83b8e.png)

リポジトリ名を入力して「```Create repository```」をクリック
（チェックボックスは3つともチェックを入れずに作成でOK）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215197/5a7a76cd-51ac-16f0-d959-7096a9d89264.png)

作成できたら以下の画面に自動遷移するので、青枠の部分で「```SSH```」が選択されていることを確認して、コピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215197/db36d479-787e-8f18-7e45-71510d06bfa3.png)


### 3. ローカルリポジトリとリモートリポジトリを紐づけて、プッシュする ###

ターミナルに戻り、STEP-1で作成した```test```フォルダにいる状態で以下のコマンドを実行

```Ruby:ターミナル（初回プッシュの場合）
git init                                    #ディレクトリをgitで管理できるようにする（ローカルでgitを使えるようにする）
git add hello.txt                           #リモートリポジトリにプッシュしたいファイルをインデックスに追加 (例：hello.txt)
git commit -m "コミットメッセージ"            #変更履歴を保存（コミット）する。"コミットメッセージ"は日本語でもOK
git branch -M main                          #デフォルト・ブランチ名をmasterからmainに変更（任意）
git remote add origin リモートリポジトリURL   #originという名前でリモートリポジトリのURLを登録。URL部分はSTEP2でコピーしたURLを貼る。これでローカルとリモートが紐づく。
git push origin ブランチ名                   #変更内容をリモートリポジトリにアップロード（プッシュ）する。デフォルト・ブランチをアップロードするなら、git push origin mainとなる
```

なお、2回目以降のプッシュの場合は、以下のコマンドのみでOKです

```Ruby:ターミナル（2回目以降のプッシュの場合）
git add hello.txt                           #リモートリポジトリにプッシュしたいファイルをインデックスに追加 (例：hello.txt)
git commit -m "コミットメッセージ"            #変更履歴を保存（コミット）する。"コミットメッセージ"は日本語でもOK
git push origin ブランチ名                   #変更内容をリモートリポジトリにアップロード（プッシュ）する。デフォルト・ブランチをアップロードするなら、git push origin mainとなる
```

これで、ローカルリポジトリの変更がリモートリポジトリに反映され、コミットにより草が生えているはずです。

GitHubの自分のプロフィールページにアクセスし、コントリビューションカレンダーを確認しましょう。
（反映まで少し時間がかかることもあります）

### ※プッシュしたのに草が生えていなかったら ###

ローカルのGitにプロフィール（GitHubに登録されているメールアドレスとユーザ名）が登録されていない可能性が高いです。
以下のコマンドで登録しましょう。

```Ruby:ターミナル
git config --global user.name "xxx"       #xxx部分にGitHubアカウントのユーザ名を入力
git config --global user.email "yyy"      #yyy部分にGitHubアカウントのメールアドレスを入力
```
ちなみに、```git config --global user.name``` のように、```" "```部分を除いてEnterを押すと、現在登録されているnameが表示されます。何も表示されない場合は、登録されていないので、上記コマンドで登録しましょう（emailの場合も同じです）。
なお、2回目以降はこの登録は不要です。

余談ですが…、以前Cloud9で作業していたときに、開発環境上にプロフィール登録をし忘れていて、それに気づかず1週間近くコントリビューションが反映されていない（草が生えてない）時期がありました。
以来、git initした後にすぐプロフィール登録（確認）と、その日の初コミット後はコントリビューションカレンダーを確認する癖がつきましたが、こんなことがないようにくれぐれもお気をつけください…！