GitHub実践ハンズオン

皆さんこんにちは！
サーバサイドエンジニアの[くろちゃん](https://twitter.com/TakumaKurosawa)です。

今回はエンジニアとして**必須スキル**である、GitHubの使い方〜運用方法まで学べるハンズオンをお届けしたいと思います！

## 【後日談】[TechTrain - MISSION](https://techbowl.co.jp/techtrain/missions/13)になりました:tada:

多くの方に読んでいただいたおかげで、[TechTrainのメンターミッションとして公開](https://prtimes.jp/main/html/rd/p/000000017.000040741.html)されることとなりました！:clap:

まさかユーザとして使わせてもらっていたサービスのメンターに抜擢いただけるとは思いもよらなかったので、本当に嬉しいです:relaxed:

このハンズオンで詰まったところや、もっと詳しく聞きたいというポイントがありましたら、是非是非[TechTrain](https://techbowl.co.jp/techtrain/)で面談予約して下さいね！←**30歳以下の方は無料で使えますよ**

## 背景
先日TechTrainユーザが集まってTechTrainについてざっくばらんに語り合うというイベントに参加してきました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Techtrainが大好きな人達で話せて、めっちゃ心地よい空間でした😊<br><br>ご飯もお酒もご馳走様でした！🙏<a href="https://twitter.com/hashtag/techtrain?src=hash&amp;ref_src=twsrc%5Etfw">#techtrain</a> の成長が楽しみです！<br><br>まだ使ってない方は是非！！↓<a href="https://t.co/mwt6hYjpYd">https://t.co/mwt6hYjpYd</a> <a href="https://t.co/7J6SsfQxc5">https://t.co/7J6SsfQxc5</a></p>&mdash; Takuma Kurosawa (@TakumaKurosawa) <a href="https://twitter.com/TakumaKurosawa/status/1230128464180629505?ref_src=twsrc%5Etfw">February 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

その際に、[TechTrainのMISSION](https://techbowl.co.jp/techtrain/missions?skill_id=all)を始めるユーザがGitHubの構築や運用方法が分からず挫折してしまうという課題を耳にしました。

本来アプリケーションの開発を学ぶためにこのサービスがあるのに、**アプリケーションを開発する前から挫折してしまうなんてもったいない**と強く感じたので、今回ハンズオン形式で学べる場を作ろうと決意しました。

実務ではGitHubは使えて当たり前の技術として扱われているので、エンジニアとしては必須のスキルと言えるでしょう！
是非このハンズオンを通じてGitHubをマスターして下さいね👍

## 対象読者
- GitHub初心者
    - https://github.com/ すら開いたことないよという方
    - Gitってそもそも何？という方
- GitHubの使い方だけでなく、具体的な運用方法についても知りたい方
- TechTrainのMISSIONを始めようとして挫折したそこのあなた！！

## 推奨環境
macOS

※Windows, Linuxの方々は適宜読み替えて下さい:warning:

## ハンズオンの進め方
このハンズオンは初めから最後まで全部やる必要はありません。

ご自身のレベル感と、現在の課題に照らし合わせてお好みのところから始めていただいて構いません。

各コンテンツのタイトルに星マークで難易度（レベル）が分かるようになっていますので、参考にして下さい。

:star:・・・レベル１
　　　 ↓
:star::star::star::star: ・・・レベル4

また、:muscle:のマークのついているコンテンツは、特にやらなくても支障はないけど、やった方が便利になったり、ステップアップに繋がるよ！という内容になっています。

それでは早速ハンズオンを始めていきましょ〜う！！

## 目次
- [GitHubの初期設定をしよう！](#githubの初期設定をしよう)
    - [1. アカウントの作成(:star:)](#1-アカウントの作成star)
    - [2. gitコマンドのインストール(brew)(:star:)](#2-gitコマンドのインストールbrewstar)
    - [3. SSH鍵の登録(:star::star::star::star:)](#3-ssh鍵の登録starstarstarstar)
    - [4. 使いやすくカスタマイズしよう！(:muscle:)](#4-使いやすくカスタマイズしようmuscle)
        - [便利なエイリアス](#便利なエイリアス)
        - [初心者でも安心！？おすすめTUIツールの紹介](#初心者でも安心おすすめtuiツールの紹介)
- [GitHubの基本的な使い方をマスターしよう！](#githubの基本的な使い方をマスターしよう)
    - [1. リポジトリを作成しよう(:star:)](#1-リポジトリを作成しようstar)
    - [2. Cloneしてみよう(:star:)](#2-cloneしてみようstar)
    - [3. Addしてみよう(:star::star:)](#3-addしてみようstarstar)
    - [4. Commitしてみよう(:star::star::star:)](#4-commitしてみようstarstarstar)
    - [5. Pushしてみよう(:star:)](#5-pushしてみようstar)
    - [Gitコマンドチートシート](#gitコマンドチートシート)
- [PullRequestを作ってマージしてみよう！](#pullrequestを作ってマージしてみよう)
    - [1. 作業ブランチを切り替えよう(:star::star::star:)](#1-作業ブランチを切り替えようstarstarstar)
    - [2. PullRequestを作ってみよう(:star::star:)](#2-pullrequestを作ってみようstarstar)
    - [3. コードレビューをしてみよう(:star::star::star:)](#3-コードレビューをしてみようstarstarstar)
    - [4. マージしてみよう(:star:)](#4-マージしてみようstar)
- [実践的な使い方を学ぼう！](#実践的な使い方を学ぼう)
    - [1. Forkしてみよう(:star:)](#1-forkしてみようstar)
    - [2. Projectを使ってみよう(:star::star::star:)](#2-projectを使ってみようstarstarstar)
    - [3. Issueを立ててみよう(:star::star::star::star:)](#3-issueを立ててみようstarstarstarstar)
    - [4. Issueに対するPullRequestを作ろう(:star::star::star:)](#4-issueに対するpullrequestを作ろうstarstarstar)
    - [5. PullRequestのマージ＆Issueのクローズをしよう(:star::star:)](#5-pullrequestのマージissueのクローズをしようstarstar)
    - [6. Fork元のリポジトリへPullRequestを投げてみよう(:star::star::star:)](#6-fork元のリポジトリへpullrequestを投げてみようstarstarstar)

## GitHubの初期設定をしよう！
GitHubって何？まず何から始めればいいの？という方向けに、アカウントの作成〜SSH鍵の登録などの基本設定をレクチャーします！

まずはGitHubのページを開いてみましょう〜↓
https://github.com

### 1. アカウントの作成(:star:)
![スクリーンショット 2020-02-22 20.25.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/3062ddbd-2c0d-7d73-a962-cb5cbc75aead.png)
↑こんな感じのページが開きましたか？

何がともあれ、まずはGitHubアカウントをサクッと作ってしまいましょう！
右上にある、「Sign up」ボタンをクリックしてください。すると、下図のようなページが開きます。

![スクリーンショット 2020-02-22 20.30.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/9236958c-2e86-60d9-ef2e-e94bfe158c80.png)

このページでは、皆さんのGitHubアカウントで使用するパスワードなどの設定をします。

- Username・・・皆さんのGitHubアカウント名です。世界中で一つの名前にする必要があります。（他の人が同じ名前で登録している場合は他の名前に変えましょう。）
- Email address・・・サインインなどで利用するメールアドレスです。きちんとメールが受け取れるアドレスを入力してください。
- Password・・・ログイン時に必要になるパスワードです。

入力が完了し、簡単なパズルゲームも解いたら「Select a plan」ボタンを押してください。
次のページで料金プランの選択を迫られますが、無料枠で十分使えるので、$0のプランを選択しましょう。

ここまで完了すれば、皆さんのアカウントは作成されます:tada:

メールアドレスによる認証が必要になるので、アカウントの設定で指定したメールアドレス宛に来ているメールから「Verify email address」しましょう。

こんな感じのページが開いたらOKです！お疲れ様でした。
![スクリーンショット 2020-02-22 20.42.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/b94612f0-5628-503a-7bc1-5a7260fb2abb.png)

### 2. gitコマンドのインストール(brew)(:star:)
**※Windowsユーザの方は、Homebrewが使えないので、下記URLからGitBashのインストールをしましょう！**
https://gitforwindows.org/

アカウントが作成できたら、ターミナルでgitコマンドが使えるようにgitコマンドをインストールしましょう！

gitコマンドのインストールに[brew](https://brew.sh/index_ja)を使うので、下記のページからbrewのインストールをしましょう。
https://brew.sh/index_ja

brewが使えるようになったら、gitコマンドをインストールします。
ターミナルで下記のコマンドを打つだけなので簡単だと思います！

``` bash
brew install git
```

インストールが完了したら、gitコマンドが使えるかどうか確認しましょう！
**※Windowsユーザの方は、インストールしたGitBashを起動して下記コマンドの入力をお願いします。**


``` bash
git help
```

こんな感じのメッセージが返ってきたら成功です

``` bash
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Reapply commits on top of another base tip
   tag        Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
```

この調子で、GitHubアカウントと紐づける作業も一緒にやっちゃいましょうか！
設定方法は簡単で、ご自身のGitHubアカウントに合わせて下記のコマンドを打つだけです！

``` bash
git config --global user.name "GitHubアカウントのユーザ名"
```

``` bash
git config --global user.email <GitHubアカウントに登録したメールアドレス>
```


### 3. SSH鍵の登録(:star::star::star::star:)
GitHubアカウントを作成してまず初めにやっていただきたいこととして、SSH鍵の登録があります。
これをやっておかないと、GitHubにターミナルでアクセスしようとする度にパスワードの入力を求められて非常に厄介なことになるので、このタイミングでやっておきましょう！

ここで1回登録してしまえば以降やる必要がないので、頑張ってくださいね:muscle:

詳しいやり方については、下記の超優良記事にお任せしたいと思います！
下記のページに飛んで、（いいねとストックを済ませた後）設定をしてみてください。設定が完了したらまたこのページに戻ってきてくださいね〜:wave:

**[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)**

### 4. 使いやすくカスタマイズしよう！(:muscle:)
GitHubを使う上で、少しでも楽に使いたいという人はこちらを参考にしてください。
ただし、本ハンズオンの内容とは関係のない蛇足情報ではあるので、必要ないと感じた方は読み飛ばしていただいて結構です！

#### 便利なエイリアス
皆さんはターミナルのaliasに何を登録してますか〜？
aliasに登録しておくことで、長くて覚えにくいコマンドを自分好みにカスタマイズできて便利ですよね！

Gitコマンドも憶えるのがしんどかったり、毎回打つのがめんどいというものが多いので、僕のオススメのaliasを共有します！よかったら登録してみてくださいね:ok_hand: 

まずは、`~/.gitconfig`をVimもしくはテキストエディタなどで開きます。

``` bash
vim ~/.gitconfig
```

開けたら、下記の内容を追記しましょう！

``` bash
[alias]
        st = status
        co = checkout
        graph = log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
        ft = fetch
```

これで完了です！！
今回紹介したaliasを登録することで、コマンドを短くすることができます。具体的には下記のようなイメージです。

- git status -> git st
- git commit -> git co
- git fetch -> git ft

#### 初心者でも安心！？おすすめTUIツールの紹介
皆さんはTUIツールというものをご存知ですか？
TUIツールとは、テキストユーザインターフェースの略称です。
要はターミナル上での操作をわかりやすくしようみたいなツールのことです。

僕も愛用しているlazygitというTUIツールを使えば、ブランチの切り替えやコミットツリーの確認、差分の確認など、コマンドを一切打つことなくGUIっぽく操作できちゃいます！

<img width="1435" alt="スクリーンショット 2020-02-22 21.18.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/f63f2d21-2012-5fb0-220f-dd4caab4dbaf.png">

インストールも簡単で、下記のコマンド一発で入ります！

``` bash
brew install lazygit
```

詳しい使い方などは、[公式ページ](https://github.com/jesseduffield/lazygit)や[[おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選](https://qiita.com/gorilla0513/items/2bb416e371c43d6d88fc#git)をご覧ください。

## GitHubの基本的な使い方をマスターしよう！
さぁ、ここからが本題です！GitHubの具体的な使い方について1から学んでいきましょう！
まずこの章では、GitHubの基本的な使い方について学んでいきます。

### 1. リポジトリを作成しよう(:star:)
GitHubでは、**リポジトリ**という単位でプロジェクト（ソースコード）を管理します。名前は難しいですが、要はプロジェクト1つ1つを指していると考えてもらえればOKです👍

それではさっそく、リポジトリの作成は簡単なので、一緒にやっていきましょう！
まずは[GitHub](https://github.com)にアクセスして、左にある「New」ボタンをクリックします。

![スクリーンショット_2020-02-22_22_51_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/abb3dcf2-04c9-aa20-a5f0-8e1e8d7b1726.png)

すると下図のようなページになるので、必要事項を入力後「Create repository」ボタンをクリックしま
す。
![スクリーンショット_2020-02-22_22_52_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/ec5277b5-9c36-e25b-46a6-b5585af04de5.png)

こんな感じのページになれば、リポジトリは完成です！
初リポジトリ作成おめでとうございます:confetti_ball:

<img width="1038" alt="スクリーンショット 2020-02-22 23.01.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/79d23007-c0de-f2b7-ec44-d4df0ef0e9dc.png">

### 2. Cloneしてみよう(:star:)
先ほどまでの作業で、プロジェクトの箱を用意したようなイメージです。
実際にプロジェクトの中にファイルを追加したりしたいので、作業を始めるための準備をしましょう！

準備といっても、コマンドを叩くだけで準備完了できちゃいますw
それが、**Clone**という機能です。

まずは何も考えずやってみましょう！
先ほどのリポジトリページにてCloneするための手順を踏みます。

<img width="1126" alt="スクリーンショット_2020-02-22_23_07_26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/b4caeae6-823d-7bec-b55e-9a65a1512e3d.png">

あとは、自分がダウンロードしてきたいディレクトリまで移動して、`git clone`コマンドを打つだけです！

``` bash
cd ~/Document/GitHub
```

``` bash
git clone <cmd + v[ペースト]>
```

こんな感じのテキストが返ってきたら成功です！

``` bash
Cloning into 'learn_github'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
Receiving objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
```

Cloneしてきたプロジェクトに移動しておきましょう！

``` bash
cd learn_github
```

### 3. Addしてみよう(:star::star:)
ローカルにGitHubで管理できるプロジェクトが用意できましたね！
それでは、実際に作業をして、リモートに反映させていきましょう。

お好みのエディタでプロジェクト（ディレクトリ）を開いてください。
恐らく初めは、READMEという名前のファイルがあるだけのシンプルなディレクトリ構造になっているはずです。
<img width="711" alt="スクリーンショット 2020-02-22 23.20.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/bf197a75-a5b3-a027-c669-14c94b9d9667.png">

下図のように、READMEファイルを開いて何かしら文字を入力してみてください。
何かしら開発を進めていると思ってください。

<img width="1052" alt="スクリーンショット 2020-02-22 23.22.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/807ddf52-8749-dd6b-e3ce-deeb03fb8ca9.png">

できましたか？
そしたら、ローカルでの変更をリモートにも反映させましょう！

まずはgit状態(status）の確認からしましょう。
下記コマンドをターミナルで実行してみてください。

``` bash
git status
```

こんな感じの表示が出ましたか？

``` bash
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
```

初めは何のこっちゃ言っている意味が分からないかもしれませんが、ざっくり言うと、「README.mdっていうファイルに変更があったよ！」って教えてくれています。

変更(diff）があったと言うことなので、実際にどんな変更があったのか確認してみましょう。
下記のコマンドを実行してください。

``` bash
git diff
```

するとこんな感じに変更点を教えてくれます！

``` bash
diff --git a/README.md b/README.md
index f9bfcf7..c1996cf 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
 # learn_github
 GitHub実践ハンズオン
+
+変更してみたよ！<-追記
```

これの見方は、
- 「＋（緑）」の行は追加された行
- 「-（赤）」の行は削除された行

と言う感じで変更点を確認します。直感的でわかりやすいですよね👍

さぁ、この変更点で間違いないことが確認できたので、実際にリモートに反映させていきましょう。
リモートに反映させるまでの流れをざっくり説明します！

1. Add・・・変更点の内、リモートに上げたいファイルのみ選択する。（例えるなら、荷物の梱包作業）
2. Commit・・・Addで選択されたファイル群にコミットメッセージを付ける。（例えるなら、梱包された荷物にラベリングする作業）
3. Push・・・リモートに反映させる。（例えるなら、出荷準備の整った荷物を届ける作業）

たったこの3ステップを踏むだけでリモートに反映できてしまいます！便利ですね:relaxed:

それでは、実際に**Add**からステップに分けてやっていきましょう！

コマンドは2通り方法があるので、その時の作業内容に合わせて選択して下さいね。

``` bash
【変更分全てをAddする方法】
git add .
```

``` bash
【指定したファイルのみをAddする方法】
git add README.md
```

きちんとAddされたかどうか、statusコマンドで確認しましょう！

``` bash
git status
```

`modified: README.md`と言う文言が緑に変わっていたら成功です！

``` bash
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   README.md
```

### 4. Commitしてみよう(:star::star::star:)
続いて、**Commit**コマンドを使って変更内容に関するラベル付けをしていきます。

ここで重要になってくるのが、**「コミットメッセージ」**です。
このコミットメッセージとは、先ほどからラベル付けと言っている、”ラベル”のことです。

コミットメッセージには、変更内容を分かりやすく記録する役割があります。
このコミットメッセージに自分のやった作業内容を**誰が見ても、分かりやすく**書いておくことで、後から遡った時にも把握しやすくなります。

コミットメッセージの良い例と悪い例について簡単に紹介します。

``` sh
【良い例】
ユーザログイン機能の実装

- メールアドレス＆パスワードで認証
- JWTトークンの発行
```

``` sh
【悪い例】
2020.2.22

- めっちゃ書いた
```

大分極端な例にはなりますが、後者は後から遡った時にどんな変更をしたコミットなのか全く分かりませんね:sweat_smile:

そんなコミットメッセージなら書く必要がないので、皆さんはきちんと書く癖を付けて下さいね👍

Commitも2通りのやり方があるので、お好みで使い分けて下さい。

``` bash
【1行のみの場合】
git commit -m "コミットメッセージ"
```

``` bash
【複数行に渡って詳細に書きたい時】
git commit
```

後者のやり方ではVimが開かれるので、Vimの操作に慣れていない方は前者のやり方を使う方が無難かもしれません。

### 5. Pushしてみよう(:star:)
さぁ、あとは**Push**してリモートに反映させるだけですね！
と言っても、特に説明することもなく、コマンド実行するだけなので、早速やっちゃいましょう。

``` bash
git push
```

はい、これだけです。

``` bash
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 348 bytes | 348.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:Takumaron/learn_github.git
   c74a8ab..0b0c5be  master -> master
```

こんな感じの文字が表示されたらできてます！
GitHubのリポジトリページへ行って、変更が反映されているか確認してみましょう！

<img width="1109" alt="スクリーンショット_2020-02-23_0_03_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/a0fdbc49-b84e-8bf3-1c70-f618b116e2f1.png">

おめでとうございます！
ここまでで、GitHubの基本的な機能はマスターしたようなもんです！！:tada:

### Gitコマンドチートシート
振り返りの意も込めて、ここで使ってきたコマンドのチートシートを残しておきます。
この次からの作業でも使う基礎コマンドになるので、覚えておきましょう！

#### `Clone`
リポジトリをローカル環境にダウンロードしてくる。

``` bash
git clone <GitHubリポジトリのクローン用URL>
```

#### `Status`
Gitリポジトリの状態を確認する。

``` bash
git status
```

#### `Diff`
変更点があれば、どんな変更があるかを表示する。

``` bash
git diff
```

#### `Add`
指定されたファイルをステージング環境（リモートに上げる前の処理場）に上げる。

``` bash
git add .
```

``` bash
git add <リモートに上げたいファイルのパス>
```

#### `Commit`
リモートに反映させる前にラベリング（コミットメッセージ）付けをする。

``` bash
git commit -m "コミットメッセージ"
```

``` bash
git commit
```

#### `Push`
リモート環境に変更内容を反映させる。

``` bash
git push
```

## PullRequestを作ってマージしてみよう！
前章まででGitHubの基本的な使い方については理解していただけたかなと思いますので、この章ではもう一歩踏み込んだGitHubの使い方をマスターしましょう！

具体的には、ブランチを切ってPullRequestを作り、マージするという一連の開発フローを経験していただきます。

### 1. 作業ブランチを切り替えよう(:star::star::star:)
まずは作業**ブランチ**についての理解を深めましょう。
作業ブランチ（branch）を適切に切ることで、他の開発者や実際に稼働しているサービスに影響を与えずに開発することができるようになります。

先ほどの章で皆さんが作業していたブランチは、masterブランチです。
プロジェクト全体の根幹となるブランチという事で、baseブランチとも呼ばれたりします。

一人で開発するプロダクトであればmasterブランチに直接Pushしても大丈夫なのですが、複数人で開発した時にはそういう訳にもいきません。

なぜ複数人での開発の場合はmasterに直接Pushしてはいけないのでしょうか？
理由としては下記のようなものが考えられますね。

- 他の人と同じところを編集してしまって、どっちが正しい変更なのか分からなくなる。（コンフリクトと言います）
- 稼働しているプロダクトであれば、baseブランチ＝リリースという事が多く、masterへ直接Pushするということは、コードレビュー等無い状態でリリースされるということになる。（危険！怖い☠️）
- 思わぬバグに気づかないままの状態になり、その人のせいでプロジェクト全体に影響が出る。

ブランチを分ける理由がわかったところで、実際にブランチを分けるとどんな感じになるのかイメージを持ちましょう。

![Github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/32469e69-cdae-85a0-9a03-e8ab5e1f65a4.png)

上図が実際にブランチを切った時の状態を表しています。
今回の場合でいうと、baseブランチであるmasterブランチからdevelopブランチという名前で新規ブランチを作成しています。

**「枝分かれ」**みたいなイメージですね。
masterブランチとは切り離した状態で開発を進めることで、masterブランチには一切影響を与えることなく開発を進める事ができます。

開発が完了し、masterブランチに開発した分の変更も反映したいという場合は、下図のように**マージ**という機能を使って簡単に取り込む事が可能です！

![Github2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/cc8c55e5-7c86-78ba-05a6-da113a9a24dd.png)

ブランチを分ける意味について少しはイメージを持ってもらえましたか？
それでは実際にブランチを切っていきましょう！

ブランチを新規で作るコマンドをターミナルで実行してください。

``` bash
git checkout -b develop
```

きちんとブランチが作られたか確認するために、下記コマンドを実行してください。

``` bash
git status
```

「On branch develop」となっていたら成功です！
これでdevelopブランチが作成されました。

``` bash
On branch develop
nothing to commit, working tree clean
```

それでは前章同様にREADMEファイルを修正してみましょう。

``` bash
# learn_github
GitHub実践ハンズオン

変更してみたよ！<-追記

developブランチから変更したよ！<-追記
```

こんな感じのファイルにしてみましょう。
`git diff`で確認すると下記のようになっています。

``` bash
diff --git a/README.md b/README.md
index c1996cf..2c0582e 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,5 @@
 GitHub実践ハンズオン

 変更してみたよ！<-追記
+
+developブランチから変更したよ！<-追記
```

ここまでできたら、`git add`と`git commit`、`git push`までしてしまいましょう！

と、ここで恐らく詰まった方が多いと思います！
というのも、新しく作ったブランチでPushをしようとした時に下記のような文言が出てエラーになるからです。

``` bash
fatal: The current branch develop has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin develop
```

こんな感じのエラー文が出た方、安心してください。
これは新規ブランチでPushしようとした時には、毎回出ます。

どうすれば良いかというと、このエラー文の最後の行をコピペして実行するだけです（簡単！）
今回でいうと、この部分ですね！

``` bash
git push --set-upstream origin develop
```

恐らく実行できたんじゃないでしょうか？

GitHubのページに行って確認してみましょう。

<img width="1136" alt="スクリーンショット_2020-02-23_12_09_27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/a28e0fc3-975a-f93a-a1c5-64f205e8dba8.png">

<img width="1124" alt="スクリーンショット_2020-02-23_12_12_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/0e58bf8f-f581-987c-197e-b0bf57d818e0.png">

<img width="1119" alt="スクリーンショット_2020-02-23_12_14_20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/5708f4b1-b21d-e845-cfaf-d54d9e6eeb56.png">

皆さんも同じように、developブランチのみに反映されているのが確認できましたでしょうか？
このように、ブランチを作ってから開発を進める事で、他のブランチとは切り離した開発環境を作る事ができます！

### 2. PullRequestを作ってみよう(:star::star:)
先ほど作ったdevelopブランチをmasterに取り込みましょう！
と、その前に実際のプロダクトではPullRequestという機能を使って、マージする前に他の方からレビューをしてもらうのが一般的です。

TechTrainの[MISSION](https://techbowl.co.jp/techtrain/missions?skill_id=all)でもメンターの方からコードレビューを受ける時などは、この機能を使ってレビューしてもらうと円滑に進むでしょう。

これから一緒に作っていきましょう！
まずはご自身のGitHubリポジトリページへ移動してください。

<img width="1125" alt="スクリーンショット_2020-02-23_12_24_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/21f53e83-f072-dbd9-b02d-7d2566989279.png">

「Pull requests」というタブをクリックすると下記のようなページになります。

<img width="1125" alt="スクリーンショット_2020-02-23_12_26_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/dc169a7f-029f-eb08-cfc7-1f244c6d6f98.png">

---

<img width="1422" alt="スクリーンショット_2020-02-23_12_29_34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/d424e712-76ad-6843-5105-546497849fd0.png">

---

<img width="1160" alt="スクリーンショット_2020-02-23_12_35_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/8cb990cc-834a-8cc7-edc0-3726eb8da7f7.png">

PullRequest完成です:tada:

<img width="1108" alt="スクリーンショット 2020-02-23 12.41.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/71adbbb1-fc5e-a9cb-19ef-62eabbf82883.png">


### 3. コードレビューをしてみよう(:star::star::star:)
PullRequestをマージする前に、レビューをしてみましょう。
現場に入ると他の人からコードレビューを依頼されることもあるので、コードレビューの仕方くらいは押さえておきたいところですね！

コードレビューのやり方自体はすごく簡単なので、一緒にやってみましょう！

<img width="1108" alt="スクリーンショット_2020-02-23_12_41_24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/0f4d06e2-b189-2e86-dacc-0a1275b3e9f5.png">

「Files changed」では、今回マージしようとしている変更分を一覧で確認できます。
個人的に見やすいと感じているSplit viewに変更しておきましょう！（これはお好みで大丈夫です。）

<img width="1427" alt="スクリーンショット_2020-02-23_12_47_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/73963fc8-7464-3376-4a85-70a1a573952c.png">

---

こんな感じで自分が変更した部分が確認できましたか？
直感的でわかりやすいですよね👍

<img width="1419" alt="スクリーンショット 2020-02-23 12.50.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/1b3bba43-0aaf-353a-593e-774c28ef2778.png">

それでは実際にレビューをしてみましょう。
下図のようにコメントとしてレビューを残す事ができます。

<img width="1423" alt="スクリーンショット_2020-02-23_12_53_54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/ca012198-3afe-c4b4-693b-0cfcfd4c6da9.png">

---

<img width="1159" alt="スクリーンショット_2020-02-23_12_57_30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/9eed1743-d107-9f60-7912-9940b1c6968e.png">


### 4. マージしてみよう(:star:)
今回の変更をマージしましょう！

マージはめちゃくちゃ簡単で、**「Merge pull request」をクリックする**だけです！！

<img width="865" alt="スクリーンショット_2020-02-23_13_02_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/bbca0e08-39d3-98e2-526b-08e29b5d4d0a.png">

こんな感じで紫色のタグで「Merged」ってなってれば完了です！

<img width="1153" alt="スクリーンショット 2020-02-23 13.07.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/f71efdee-8482-a709-6812-34f2aa049500.png">


リポジトリのTOPページに戻ってみると、ちゃんとマージされてmasterブランチに変更内容が反映されているのが確認できますね！

<img width="1151" alt="スクリーンショット_2020-02-23_13_10_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/e55c9fbb-31f9-a573-c340-7e4dee5a10f9.png">



## 実践的な使い方を学ぼう！
さぁ、ここまでこればGitHubを使ったチーム開発も心配いらずって感じですね！？

この章では、GitHubを使ってもっと効率的にプロジェクトを進めたいという方向けに、GitHubの実践的な使い方をご紹介します。

1~6ステップまで一続きのハンズオンになってますので、是非最後までやってみてくださいね！

この章を通して、下記のような事ができるようになります :muscle: 

- Fork
- Projectを使ったIssue管理
- Issueベースの開発

### 1. Forkしてみよう(:star:)
**Fork**機能を利用する事で、誰かが作っているプロジェクトをベースとして自分のプロジェクトを作れたり、世界中のプロジェクトに対してプルリクが投げられるようになっています。

OSSを加速させるための機能ですね！！

早速皆さんも下記のリポジトリをフォークしてみましょう！

▼こちらにアクセス
https://github.com/Takumaron/learn_github


<img width="1414" alt="スクリーンショット_2020-02-23_14_08_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/d7130e64-a21a-c833-e53c-d4a29cbfcbd6.png">

はい、これだけでFork完了です！！
めちゃ簡単ですね！1クリックで人の作ったものを踏み台にできちゃいます:relaxed:

<img width="1242" alt="スクリーンショット 2020-02-23 14.11.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/c84836c0-d0fa-dc69-3476-0a996ba3a134.png">


### 2. Projectを使ってみよう(:star::star::star:)
Forkしてきたリポジトリを使ってより実践的な使い方を学んでいきましょう。

まずは、Projectという機能を使って開発全体の進捗を管理できるようになりましょう。

<img width="1418" alt="スクリーンショット_2020-02-23_14_14_00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/874c01a2-ff9a-cc9a-6685-686f392c36d6.png">

---

<img width="1113" alt="スクリーンショット_2020-02-23_14_16_18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/544e3c6c-0307-8070-293e-4f31b8fd6604.png">

↓こんな感じのページが表示されればProjectの作成は完了です！:confetti_ball:

<img width="1427" alt="スクリーンショット 2020-02-23 14.19.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/7ec4805f-6955-e031-9d4e-1e6bdd3c45a3.png">

「Welcome to GitHub Projects」などの初めから存在しているカードは要らないので削除しておきます。

<img width="680" alt="スクリーンショット_2020-02-23_14_22_38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/359e1961-2300-a26b-1e61-ce10e6e11d48.png">

---

<img width="1426" alt="スクリーンショット 2020-02-23 14.22.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/93c0adaf-3cd9-a506-d3d9-ea746a55154a.png">


### 3. Issueを立ててみよう(:star::star::star::star:)
**Issue**という機能は名前の通り、課題や問題を管理できるGitHubの重要な機能です。
実際に手を動かしながら、Issueベースの開発に慣れていきましょう！

まずは、Issueを使えるように設定を変更します。

<img width="1067" alt="スクリーンショット_2020-02-23_14_37_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/f1233717-9a39-9f0e-bab8-9daa37d915af.png">

<img width="783" alt="スクリーンショット_2020-02-23_14_38_08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/3ddde061-9562-f608-0479-2cd54a6fbe2e.png">

---

ProjectsのページでIssueを作成できるので、下記の手順に従ってIssueを作成してみてください！

<img width="1224" alt="スクリーンショット_2020-02-23_14_34_49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/f242fb8e-33c8-8a30-de2a-597f04265fa4.png">

<img width="1409" alt="スクリーンショット_2020-02-23_14_41_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/038b96de-50a9-8010-9d0d-682af0e9f850.png">

<img width="939" alt="スクリーンショット_2020-02-23_14_43_30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/49773553-d2a8-7808-55db-f19946884ed6.png">

<img width="1422" alt="スクリーンショット_2020-02-23_14_45_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/d5870982-897e-a325-107f-d72ee7d0e301.png">


### 4. Issueに対するPullRequestを作ろう(:star::star::star:)
作成したIssueを元に、「Webページのテンプレを作る」という作業をやっていきましょう。

作業に入る前に、せっかくProjectを使っているので、下図のようにカードを「To do」から「In progress」へ移動しておきましょう！

<img width="1238" alt="スクリーンショット_2020-02-23_15_14_38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/ffb71fda-b45b-cb6f-988f-fe20935ac24c.png">

気を取り直して、ローカルでの開発をスタートさせましょう！

まずは、「ブランチを切る」でしたね！！
ここで、ワンポイント:point_up:

ブランチ名にもルール付けするとわかりやすく、運用もしやすくなります。
ひとまず今回は、僕がよく使うブランチルールに則ってやってみましょう。

``` bash
【ブランチルール】
feat/[issueの番号]/[作業内容]
```

今回の場合でいうと、

- issue番号：1
- 作業内容：createWebTemplate（Webページのテンプレートを作成する）

なので、下記のようなブランチ名になります。

``` bash
feat/1/createWebTemplate
```

ちなみに、Issue番号の確認方法は、下図のように、Issueタイトルの横の「#1」のような数字がIssue番号になります。

<img width="1422" alt="スクリーンショット_2020-02-23_14_45_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/97001f1a-6239-fe4b-8724-4ed1f44d1d67.png">

▼新規でブランチを作るコマンドです。

``` bash
git checkout -b feat/1/createWebTemplate
```

ブランチが切り替えられたら、お好みのエディタでプロジェクトを開きましょう。

<img width="1440" alt="スクリーンショット 2020-02-23 14.57.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/8080e08f-f325-9dc9-88f8-d4a0a5290283.png">

今回はWebページのテンプレートを作成するという事だったので、下記のような手順で作業を進めましょう。

- 自分のGitHubアカウント名で新規ディレクトリを作成
- その中にindex.htmlを作成
- `<h1>[自分のGitHubアカウント名]</h1>`と記述

完成したら、下図のような状態になると思います。

<img width="1440" alt="スクリーンショット 2020-02-23 15.02.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/973be1eb-925f-2462-f373-0129e7bfe50e.png">


`git add .` 〜 `git push`までは基本操作と変わらないので、やり方を忘れてしまったという方は、前の章に戻って復習してきてくださいね👍

PullRequestの作成に移ります。

PullRequestを作る際に**あることをするだけで、PullRequestがマージされるタイミングで勝手に関連するIssueを削除してくれる**機能があるので、今回はそちらを使ったPullRequestを作成しましょう。

と言っても、PullRequestのdescriptionの所に「close #[issue番号]」と書くだけです。
前章までで学んだPullRequestの作り方に変わりはないので、同様に作成してください。

※ここで作成するPull Requestは、自分のリポジトリのmasterブランチに対するPullRequestですので間違えないようにお願いします！！

<img width="1105" alt="スクリーンショット_2020-02-23_15_09_00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/31a0fa18-9e9c-0cf3-df28-28f923aa20d8.png">




### 5. PullRequestのマージ＆Issueのクローズをしよう(:star::star:)
自動でIssueが閉じられる設定をしたPullRequestをマージしてしまいましょう！

<img width="1156" alt="スクリーンショット_2020-02-23_15_19_22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/1acbc664-c5c5-c02f-74ce-888aba2453ff.png">

正常にマージされたら、Projectに戻ってみましょう。
きっと、みなさんが作ったIssueがCloseされているはずです！！

<img width="1204" alt="スクリーンショット_2020-02-23_15_23_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/bb927314-d03a-abdc-7483-46383b9fcdc0.png">

カードを「Done」のところに移動しておきましょう。

<img width="1273" alt="スクリーンショット_2020-02-23_15_25_26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/b639147f-c3eb-68cf-e0de-e0c9b3946027.png">




### 6. Fork元のリポジトリへPullRequestを投げてみよう(:star::star::star:)
実は、Forkしてきたプロジェクトを自分なりに改良したりした成果を、Fork元へ取り込んでもらえる機能も存在します。

OSSの世界では、この機能を使って、バグの修正などをユーザが自ら改善し、PullRequestを投げることでそのプロジェクトに貢献しようという気運が高まっています。

みなさんも是非、今回Forkしてきた元のプロジェクトである僕のリポジトリに対してPullRequestを投げてみてください！

やり方は普通のPullRequestを作るのと同じようにして、マージする先を僕のリポジトリのmasterブランチへ向けるだけですので、是非挑戦してみてください！

もしやり方がわからないよーという方がいらっしゃいましたら、[Twitter](https://twitter.com/TakumaKurosawa)もしくは、こちらの記事へ直接質問してください。

**[TechTrainの面談予約](https://techbowl.co.jp/techtrain/mentors/78)でもご質問お待ちしております！**

わからない方が多いようでしたら、Fork元へのPullRequestの作り方も記事にしますので！

## おわりに
ここまで本当にお疲れ様でした！！
かなり長いハンズオンになってしまって大変恐縮ではありますが、1人でも多くGitHubで躓く人が減ったらいいなと思って画像多めのボリューミーな内容に仕上げました。

GitHubは初めのうちは慣れないかもしれませんが、開発する上では必須のスキルなので、是非使いまくって苦手を克服していってくださいね :muscle: 

この記事がGitで悩む人のバイブルのような存在になることを祈っています。