GUIで実践！GitHub入門ハンズオン（with VSCode)

# はじめに
GitHubの入門・ハンズオンはCUI（コマンド）ベースのものが多く、初心者の方にはなかなか取っつきにくいのではないかと思います。
そこで、本記事ではGUIを用いてGitHub入門ハンズオンを行いたいと思います。GUIはVSCodeの拡張機能を使います。
主な対象者は次のような方々です
- GitHubを学ぼうと思ったがコマンドばかりでイメージがつきにくいという方
- 新人にGitHubを教えることに苦労している方

# ハンズオンの流れ
ハンズオンでは次のことを行います。
- Part1: 環境構築
- Part2: コードをダウンロードしてVSCodeで開く(clone)
- Part3: ブランチを切ってコードを変更し、GitHubにPushする
- Part4: Pull requestを出してレビューしてもらう

このハンズオンを行うことで、実際の開発におけるGitHubの利用の流れが理解できるほか、
clone, add, commit, push, fetch, pullといったコマンドをGUIを使って直感的に理解することができます。

# 前提条件
ここでは次の項目は完了していることを前提とし、特に解説はしません。
既に良記事がたくさんありますので、そちらを参考にしてください。

- GitHubのアカウント登録・初期設定
- VScodeのインストール
- gitのインストールと初期設定

# Part1 環境構築
### VSCodeでGitHub拡張機能(Git Graph)をインストール
VSCodeのGit Graphという拡張機能をインストールします
この拡張機能を入れることで、gitの仕組みを視覚的に理解・操作できるようになります
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/d1314c67-64c8-f461-db02-0a3f0ffe324e.png)

### GitHubのレポジトリを作成
GitHubのレポジトリを作成していきます。レポジトリとは、コードやその変更履歴を管理する場所です。
GitHubにログインし、右上のメニューバーの＋ボタンから「New repositoryをクリックします」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/f89b1b28-ea8b-a814-4f19-b043c3de4f83.png)
続いてレポジトリ作成画面です。
ここでは、Repository nameは"github_hands_on"にします。Public/Privateはどちらでもいいですが、ここではPrivateにします。Add a README fileにはチェックを入れておいてください（後ほど使います）
入力できたら最後にCreate repositoryをクリックします。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/71eea7e2-98d2-a601-898a-d99eeea6c544.png)

## Part2 コードをダウンロードしてVSCodeで開く(clone)
さて、gitのレポジトリができました。
まだここにはREADME.mdしかない状態です。
まずはこのGitHubのレポジトリのURLをコピーしておきます
先ほど作成したレポジトリのページから、次の手順でVSCodeで開くためのURLをコピーします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/cf0296ce-2de7-1cd4-1cc8-2a49f3d9e992.png)
続いて、VSCodeを使ってローカルでGitHubで作成したgitレポジトリを開きます。
まずはgitの初期化を行います。
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/ece1492b-2e5e-74a2-1004-f50bf13a6a28.png)
次にメニューからcloneを選択します。（cloneとはGitHubのレポジトリをローカルにダウンロードすることです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/fa2737e6-f69d-a36a-5bde-199558dbf53a.png)
入力画面が現れるので、先ほどコピーしたURLを記載します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/2d9a6888-981d-5230-a51b-e91f360600ad.png)
するとレポジトリをダウンロード(clone)するディレクトリの選択画面が出てきますので、好きな場所を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/d80e3c9d-4aca-e014-fd8b-f453eaa0e52b.png)
右下にこのようなメッセージが出てくるので、Openを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/9b5de488-5910-c9be-d993-e6c85daf5c3c.png)
このような画面が表示されたら成功です。
README.mdをクリックしてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/af4d34cc-d1e2-5224-2998-0447cd765ad4.png)
github上のファイルと同じく、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/55117913-1128-f0e7-13d6-8d4d3bb9b8a9.png)
とだけ書かれたファイルを取得できているはずです。

## Part3 ブランチを切ってコードを変更し、GitHubにPushする
ここではソースコードを変更して、変更内容をGitHubにアップロードします。
GitHubにアップロードすることで、他の人にも変更内容を共有できたり、変更内容のバックアップが取れたりといったメリットがあります。
ソースコードを変更するに当たり、ブランチというものを作ってそこで作業を行います。
ブランチとは文字通り「枝」で、本家のソースコード(mainブランチと呼びます)からソースコードを枝分かれさせて、並行して別作業を行う場所のことです。
実際にやってみたほうがイメージが付きやすいので、やってみましょう。

### ブランチを作成して、作成したブランチに切り替える
VSCodeでgitのアイコンを選択し（①）、GitGraphのアイコンを選択します（②）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/f0fe1d2c-ad00-4706-399f-78d00112c6e8.png)
するとこのような画面が出てきます。
今はmainブランチで作業をしている状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/58ad7b44-8fff-4e39-a51e-d01585ad2aaa.png)
ここからブランチを切ってみます。
Initial commitと書かれた行を右クリックして、Create Branchを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/395ed487-576d-976d-c749-19446630b256.png)
ブランチ名はadd_hoge_to_readmeにしておきます。名前は何でもいいのですが、今からreadmeに"hoge"という文字を追加しようと思いますので、このブランチ名にしておきます。
Create Branchをクリックするとブランチの作成が完了します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/99cba9ee-3fa1-9dab-f4af-c6ba86e908ae.png)
成功するとこのような状態になります。
まだこの時点ではmainブランチ上で作業をしている状態ですので、 先程作成したadd_hoge_to_readmeブランチに切り替えます。
ブランチ名をダブルクリックすると切り替えることができます（これをcheckoutといいます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/6aabfa0d-7c05-0d0e-975d-7ce433bf7681.png)
切り替えが完了すると、add_hoge_to_readmeが先頭に太字で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/2ab484ec-1d50-0a33-8859-d99c22bab856.png)
これで　add_hoge_to_readmeブランチで作業できる状態になりました！

### コードを変更してcommit&pushする
では、add_hoge_to_readmeブランチでコードを変更してみましょう。
ファイルのアイコンを選択し、README.mdを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/8cd6c291-9922-8510-9f98-b0b271076f51.png)

```
# github_hands_on
```
と書かれた状態です。mainブランチから枝分かれをさせたので、mainブランチの内容はそのままコピーされています。
ここに、エディターで`# hoge`とだけ書き加えます
実際はここで関数の追加など複数行のコード変更を行う場合がのですが、今回はハンズオンなので簡易的に1行だけ追加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/c8dbc884-a474-7a91-cbb8-d894a6680b5c.png)
変更内容を保存したあとは、gitのアイコンを選択肢、README.mdをクリックすると、変更内容を比較することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/b53928cc-07ec-a526-3e44-e4b1a179cd87.png)
次に、この変更内容を変更履歴として記録します
①変更内容を記録するファイル一覧に、README.mdを追加します(addと呼びます。記録したいファイルとそうでないファイルを選別するための機能です)
②commitする際のメモを記載します（コミットメッセージと呼びます）
③変更内容を記録します（commitと呼びます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/e39a72b6-f9e2-ceed-9e71-c3a3f8fc48d4.png)
これでcommitが完了しました。
Git Graphをもう一度確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/002c25ab-023d-43d7-62fe-fe57d340dba0.png)
今変更した内容が記録されています。
さて、ここでブランチのイメージを持っていただくために1つ実験を行います。
再びmainブランチに移動してみましょう（checkoutです）
mainブランチをダブルクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/ffd964a8-6454-18ce-de66-d84c6f155772.png)
この状態でREADMEを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/f98da6dc-3c31-4345-4a43-9f5fac82293e.png)
先程追加したhogeがありません。
すなわち、hogeを追加するという変更は先程の"add_hoge_to_readme"ブランチでのみ行われていて、mainブランチには影響を及ぼしていないということです。
複数の人が同時に作業するときに、このように各自が独立した場所で作業ができるようになることが、ブランチを切って作業を行うメリットです。
もう一度"add_hoge_to_readme"ブランチをダブルクリックして戻ってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/b24ff0dd-1855-41f4-e7eb-6e8c57385bbb.png)
先程追加したhogeが再度現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/56e1f0d4-53b7-989c-214b-82a206ffd0ac.png)

### commit内容をGitHubにpushする
ここまでで、READMEに`# hoge`を追記し、その変更内容を記録することができました。
しかし、まだこの変更内容はローカルPC上でしか記録されていません。
試しにGitHubで確認してみましょう。
まだブランチはmainしかありません。先程作成したadd_hoge_to_readmeブランチはGitHubにはまだ反映されていないということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/e74ea53b-5fd8-da3f-4f70-aaad7040fa63.png)
では、ローカルで記録した変更内容をGitHubにアップロードしましょう。
この作業をpushと呼びます。
pushはVSCodeのgitメニューにて、Publish Branchボタンをクリックすれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/e6870fea-0509-8526-30ab-65e351ca7e0a.png)
pushが終わったら、GitHubで再び確認してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/442ce5da-c930-e262-4b1d-ca713fe024ba.png)
add_hoge_to_readmeブランチが現れました。
このブランチ名をクリックしてGitHub上でもadd_hoge_to_readmeブランチに切り替えてみましょう。
先程追記したhogeが反映されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/39317afe-5f41-ce32-dec0-7e1ef3d2477d.png)

## Part4 Pull requestを出してレビューしてもらう
これでGit Hubにコードをpushできましたが、これはなんのためでしょうか？
もちろんコードの変更履歴のバックアップという意味もありますが、開発では自分の変更を人に見てもらい、コードに問題がないか、もっと良い書き方が無いか、などを見てもらう「コードレビュー」という作業がよく行われます。
ここでは、コードレビューの手順を解説します。

### Pull Requestを出す
GitHubでPull requestsタブを選択後、New pull requestを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/07df7c94-824f-d878-14e0-116a3777de4b.png)

compareの部分で先ほど作成したadd_hoge_to_readmeブランチを選択します。
これによって、add_hoge_to_readmeブランチの変更内容を、mainブランチにも反映をさせてください、というリクエストである"Pull Request"を作ることができます。
次にCreate pull requestをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/e1fa659b-1c21-a55c-16d2-40eb58d831b8.png)
次の画面で変更内容などを記載し、Create pull requestボタンをクリックするとPull Requestの作成完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/b1c54f46-b680-3339-fbca-e9f5545abf9b.png)

### レビューしてもらう
さて、いま出したリクエストは人にレビューをしてもらいます。（誰かにレビューを依頼して見てもらう形です）
先ほど作成したPull Requestの画面でFiles changedタブをクリックすると、変更内容の差分が表示されます。
さらに、行についている＋ボタンをクリックすると、コードにコメントを書くことができます。
レビューをしてくれる人は、この機能を使ってレビューをしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/2d7931e5-6de5-5807-8a00-f454ee1c08e2.png)

返ってきたレビューを踏まえて自分が修正する必要があれば、コードの変更→commit→pushという先程の流れをもう一度行い、再度レビュアーに見てもらいます。
これを繰り返すのがレビュープロセスです。

### Pull Requestをマージする
コードレビューが終わり、すべてのコードに問題がない状態になったら、add_hoge_to_readmeブランチでの変更内容をmainブランチに上書きします（これをマージと呼びます）。
では、マージをしていきましょう。
Conversationタブをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/16cbf936-ac62-2a77-5eb6-3ef8e8cd4ea6.png)
Merge pull requestをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/b788befa-b08d-7944-77a4-227ae6999525.png)
Confirm mergeをクリックすると、マージが確定されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/6bdbdc06-87e0-3284-875a-d73bb0b9f5aa.png)

### VSCodeでマージされた結果を確認する
さて、いまGitHubでマージされたが、これをVSCode上でも確認してみましょう。
Git Graphを再び開いてみましたが、まだマージされたことが確認できない状態です。
これは、ローカルではまだGitHub上で起こった変更を把握できていないためです。この情報を取得するために、ダウンロードボタンのようなものをクリックしてみましょう（この作業をfetchといいます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/bb804668-4584-ffc2-5451-13b75fc7c95c.png)
すると変更内容が更新されます。add_hoge_to_readmeブランチが、origin/mainブランチにマージされていることが確認できます(GitHub上でのmainブランチを表しているのが、一番上のorigin/mainブランチです)
これは、GitHub上のmainブランチではadd_hoge_to_readmeの変更内容が上書きされていることを表しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/cb6b414b-a013-ce3c-cc67-56d05c4772bd.png)
さて、ここでローカルのmainブランチに移動してみましょう。mainをダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/32d3c6e3-9289-5bad-2511-0d3fd3afebcb.png)
すると、ローカルのmainブランチに移動できました（mainと書かれた文字が太字になって、文字の手前に○印がつきます）
この状態でREADME.mdを見てみましょう。まだ#hogeは反映されていないですね。GitHub上のmainブランチには#hogeが反映されているのですが、これがまだローカルのmainブランチでは反映されていない状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/d44e7f54-9dd3-8eb6-a4b3-0b35dd307e58.png)
では、GitHub上の最新のmainブランチをローカルにも反映させましょう。
左側のメニューから'Pull'を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/1c7beef3-998f-f5fb-b9b3-68771b6c6785.png)
すると、一番上のmainブランチが太字になって、文字の手前に○印がつきます。
これは、GitHub上でのmainブランチの変更内容をローカルにも反映できた状態です。いま、ローカルのmainブランチとGitHub上のmainブランチは全く同じ状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/b07a898e-1f4e-8328-26e4-09da69a7fe83.png)
確認のために、README.mdを見てみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704657/ff2c76fd-7c30-e56a-a960-669614f99f6b.png)
`# hoge`が追加されていますね。
このようにして
コードの変更→Push→Pull Request→マージ
の手順を繰り返しながら、mainブランチの内容をどんどんアップデートしていくのが、基本的なGitHubの開発フローになります。

# おわりに
以上がGitHubのハンズオンになります。
GitHubを使った開発の一連の流れを体験していただけたのではないかと思います。
今回ご紹介したのは基本的な操作方法ですので、詳しい使い方は調べたり周りの人に質問しながら学んでいっていただければと思います。