基本的なGithub Flowを通して、共同開発に必要なGithubの基本を学ぶ

# 目的
この記事では、これからGithubを使ってみようという方、共同開発を行う方に向けて、開発に必要な一連の手続きをコマンド代表的なコマンドと共に説明していきます。
Githubからローカルリポジトリへの同期手続きから、実際に開発する際に必要となるGithubフローを取り上げ、理解を深めていきます。
# Githubとは
Git管理したファイルを共有・バージョン管理をするインターネットサービスです。
今回の記事は、Gitの基本的な知識があることを前提に記載していますので、そもそものGitについて知りたい方は、前回掲載した[【初心者向け】Gitの基本とできること【コマンド集】](https://qiita.com/raptony110/items/1d50db2ac31800681cb9)という記事をご一読の上戻ってくるとスムーズかと思います。

# アカウント作成
Githubを利用するには、まずアカウント登録を行う必要があります。
[Githubの公式ページ](https://github.com/)に移動して、右上のSignUpからアカウント登録を行いましょう。
メールアドレスとユーザー名を入力して、受信したメールから承認を行えば簡単にアカウントを登録することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/e41048e2-72d7-eed0-f51c-c153be7a772e.png)

# リモートリポジトリを作成する
アカウントを作成できたら、ローカルリポジトリと同期するための領域になるリモートリポジトリを作成します。リモートリポジトリは基本的に読み取り専用のため、第三者に編集を許可したい場合は、事前に招待する必要があることを覚えておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/a06c3485-facf-7dd9-1c7a-70c2a9fb67d0.png)

# Githubでの操作
## リモートリポジトリをクローンする
リポジトリのCodeドロップダウンをクリックすると下のようなクローン用のリンクが表示されますので、こちらおコピーしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/55162d35-4089-ee6b-fbb7-36d211ab8b65.png)
ターミナルに戻って以下のコマンドを打ちます。
```
$ git clone 先ほどコピーしたURL
```
実行すると、実行したディレクトリの配下に、リモートリポジトリ名のディレクトリが作成されます。
早速、コミット履歴を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/4bcc1fc7-a2f2-9c22-fcdc-f601fd502cf0.png)

ここでいきなり、mainとかoriginとか身に覚えのない単語が出てきますが、全然難しくないので覚えてしまいましょう。
- **origin**
    - ローカルリポジトリから見た、リモートリポジトリの名前です。
- **main**
    - デフォルトブランチの名前です。
        - 元々Githubもmasterでしたが、差別的な言葉を排除する目的で2020/10に変更されました。
        - gitでは、masterブランチと呼んでいましたが、Githubではmainという名前になります。
- **origin/main**
    - originリポジトリのmainブランチのことを指します。読み取り専用のブランチなので、このブランチにSwitchしたりといった操作はできません。
    - リモートのブランチを表現しているので、リモート追跡ブランチと呼ばれます。
- **origin/HEAD**
    - リモートリポジトリoriginが指しているHEADです。
### リモート追跡ブランチを表示する
```
$ git branch -r
```
## リモートリポジトリの一覧を表示する
```
$ git remote    
$ git remote -v    //-vオプションでリモートリポジトリのURLを確認することができます。
```
## リモートリポジトリの最新状態で、ローカルリポジトリを同期する
fetchコマンドで、リモートリポジトリの内容を同期した後に、mergeを行なっていますが、これはfetchしただけでは、
ローカルリポジトリのHEADは変わらないためです。origin/mainブランチをマージすることで、リモートリポジトリのHEADとmainブランチのポインタも同期します。
```
$ git fetch [origin]    //originはデフォルトで指定されるので省略可能
$ git merge origin/main
```
もしくは、以下のpullコマンドであれば、fetchとmergeをまとめて実行してくれます。
```
$ git pull
$ git pull --rebase    //rebaseオプションを付けると、リベースがおこなわれ、コミットログが綺麗になります。
```
## リモートリポジトリにプッシュしましょう
```
$ git push　origin main    //originおよび、mainはデフォルトで指定されるので省略可能
```
### タグを追加する
```
$ git push　origin タグ名
```
### タグを削除する
```
$ git push　origin --delete　タグ名
```
# Github Flow/Feature Branch Flow
Githubを使って、共同開発を行う際に標準となる型（考え方）のようなものです。
新機能の開発やバグ修正の際は、ブランチを切って作業することになります。
その際に、リモートリポジトリにリモート追跡ブランチを追加したり、プッシュしたりする必要がありますので、
以下に基本的なフローと利用するコマンドを記載しておきます。
## 1.ローカルブランチと、リモートブランチの対応関係を確認する
以下のコマンドで、ローカルブランチと、リモート追跡ブランチの対応状況を表示することができます。
```
$ git branch -vv
```
## 2.pushする際に、リモート追跡ブランチを作成する
ローカルリポジトリ内で初めてブランチを切った場合は、リモートリポジトリ上にはリモート追跡ブランチがありませんので、追加する必要があります。
```
$ git push -u origin ローカルブランチ名
```
この後の作業は、Github上でプルリクエストを作成して、承認されたらGithub上でマージが実行されます。
## 3.プルリクエストを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/bea21f31-6e14-4e63-e2ec-f1798f7bb12c.png)
## 4.プルリクエストを承認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/f5a3376e-04d0-6e15-3dc3-7c01631ec4c3.png)
## 5.「Confirm merge」ボタンをクリックしてコミットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/53ffa8be-684f-df5f-4e4d-527186612ccc.png)
## 6.コミットされると、ブランチの削除を促されますので、Deleteします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/1b1ea50e-0ccb-f1a8-b03a-85c24223c6af.png)
マージされたら、ローカルリポジトリ同様にリモート追跡ブランチを削除しましょう。
## 7.リモートリポジトリでコミットされた結果を、ローカルリポジトリに同期します。
```
$ git switch main    //ローカルリポジトリのブランチをmainに変更します
$ git pull
$ git branch -d プッシュしたブランチ名　　　　//一つ前のpullコマンドでfetchとmergeが実行されているので不要なブランチを削除します
```
## 8.リモートリポジトリで、既に削除されたリモート追跡ブランチをローカルリポジトリで一括削除する
```
$ git remote prune origin
```
これで、リモートにプッシュした後、ローカルリポジトリでも同じ状態になりました。
# まとめ
この記事では、GithubへのPushやPullを題材にして、ローカルリポジトリとリモートリポジトリの一連の操作を説明しました。
あとは、実践で手を動かしながら身につけていきましょう。