🔰GitHubのissue機能と複数ブランチ（main, develop, feature）を用いたGit開発の流れ

# はじめに
はじめまして、プログラミング初学者の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

プログラミングの勉強をする中で、

>- 「実務ではmainブランチに直コミットはしない」

>- 「GitHubのissue機能をタスク管理に使うと良い」


という情報を度々見かけ、自分なりに開発手順をまとめました。

:::note warn
※実務未経験者が書いております。
実務経験の先輩方、違和感がある部分等ありましたら、ぜひご教示いただければと思います!
:::

# 前提
GitとGitHubの連携は済んでいるという前提で書いております。
（ローカルリポジトリとリモートリポジトリに「main」ブランチのみがある状態と仮定し記述しております。）

# 手順

## developブランチの作成

mainブランチでは作業しないため、developブランチを切ります

```
git switch -c develop
```

新しいブランチの作成は`git checkout -b ブランチ名`でも可能です！
`switch`の方が比較的新しく追加されたコマンドのようで、こちらで記載しました！

## developブランチをリモートリポジトリに反映

```
git push -u origin develop
```

## GitHubにてissue発行

![Screen Shot 2021-10-30 at 19.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/50480b2e-9907-bb3f-14c7-e55810ed8a26.png)
![Screen Shot 2021-10-30 at 19.26.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/c8acb50a-3357-b79a-f088-9a50953a23cb.png)

## 作業前にリモートのdevelopブランチをローカルに反映
1人で1台で開発する場合不要そうですが、、ローカルのdevelopブランチをリモートに合わせておきます
（記事1周目の場合も、先程developブランチをローカルからリモートに反映したばかりなので不要ですね）

```
git switch develop #①developブランチへ移動
git fetch #②リモートのdevelopをローカルのリモート追跡ブランチorigin/developに持ってきてます
git merge origin/develop #③ローカルのdevelopに、ローカルのリモート追跡ブランチorigin/developを反映させます
```


## featureブランチの作成

developブランチから、実際に作業をするfeatureブランチを切ります

```
git switch -c ブランチ名（例：feature/#1_add_〇〇)
```

ブランチ名のところに#数字という形でGitHubのissue番号を入れておくと、どのissueの作業を行うブランチなのか分かりやすくなります

## featureブランチをリモートリポジトリに反映

```
git push -u origin 先程作ったブランチ名
```

## 〜　ファイル編集　〜
- 細かい粒度でコミットする
- `push`も定期的に行う

と良いみたいです！

## 編集後

```
git diff #編集内容の確認
git status #編集したファイルの確認
git add -A #編集したファイルをインデックス（ステージングエリア）に追加
git commit -m "#issue番号　コミットメッセージ" #コミットメッセージに「#issue番号」を含めましょう！
```

:::note
コミットメッセージの中に「#1」のように「#issue番号」を入れることでGitHubのissueと結びつけることができます！
:::

## push前にdevelopの最新状態を取得

```
git switch develop #developブランチへ移動
git fetch
git merge origin/develop
```

（こちらも1人で1台で開発する場合不要とは思います）
（競合があれば、（チーム開発の場合、修正したメンバと）確認しながら修正することになると思います）

## リモートにpush

```
git switch featureブランチ
git push -u origin featureブランチ
```

## GitHub上でプルリクエスト＆マージ
### （featureブランチをdevelopにマージするための）プルリクエストを作成
![Screen Shot 2021-10-30 at 21.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/942024da-5555-c027-4419-bf066ba36067.png)
![Screen Shot 2021-10-30 at 21.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/9c40b236-a993-5975-8993-a16395e8d62b.png)
![Screen Shot 2021-10-30 at 21.07.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/b7d686a4-6903-b8d9-5a21-56fec02b60d9.png)

### マージの実行
![Screen Shot 2021-10-30 at 21.19.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/15fb804c-9afa-8ec9-3698-bc8ebddfed22.png)
![Screen Shot 2021-10-30 at 21.20.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/7e917c3f-e429-d3fe-e10a-37dd35a368d0.png)
![Screen Shot 2021-10-30 at 21.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/7f8c243f-9fb8-4354-361c-64fb48dbbe88.png)

## GitHub上で対象issueをclose
![Screen Shot 2021-10-30 at 21.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/2ae6ece2-8315-6ef6-8464-2477f1122644.png)
![Screen Shot 2021-10-30 at 21.33.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/6c682eb4-eca9-a443-66ff-bb48797eef12.png)
![Screen Shot 2021-10-30 at 21.35.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/ad79ccc5-0507-8373-1e6d-f75b7c9b4e22.png)

## ローカルのdevelopをリモートと同じ状態にする

```
git switch develop
git fetch -p
git merge origin/develop
```

［`git fetch -p`について補足］

1. `git fetch`に`-p`オプションを付けることで、（git fetchしつつ）リモートに存在しないブランチをローカルのリモート追跡ブランチから削除することができます。

1. GitHubでは、マージされたタイミングでマージ元のブランチが削除される設定がデフォルトのようです。

1. （今回の場合、リモートのfeatureブランチがマージによって無くなっているのでローカルのリモート追跡ブランチにあるorigin/featureブランチが`git fetch -p`により消えます）

## ローカルのfeatureブランチを削除
ローカルのリモート追跡ブランチfeatureは削除できましたが、ローカルの作業ブランチfeatureが残っているので削除しておきます。

```
git branch -a #ブランチ一覧の表示
git branch -d featureブランチ
```

## 〜　一連の流れ完了　〜
これにて一連の作業が完了となります！🎉
次の作業に移るには、再び「[GitHubにてissue発行](https://qiita.com/kat_log/items/129beef8bd7c83a3ff38#github%E3%81%AB%E3%81%A6issue%E7%99%BA%E8%A1%8C "GitHubにてissue発行")」から行う形になります。

# おわりに
お読みいただきありがとうございました。
自分と同じく初学者の参考になれば嬉しいです。
また、実務未経験者が調べながらたどり着いた流れになりますので、実務的にはこうした方が良い等アドバイスありましたら、ご教示いただければと思います。
↓に参考にさせていただいたページの一覧を付けております。
初学者の方々、一緒に頑張っていきましょう〜😄

# 参考
 - [GitHubのissueを活用した、個人アプリの開発手順を書いてみた](https://qiita.com/tkmd35/items/9612c03dc60b1c516969 "GitHubのissueを活用した、個人アプリの開発手順を書いてみた")
 - [いまさらだけどGitを基本から分かりやすくまとめてみた](https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0#%E7%95%AA%E5%A4%96%E7%B7%A8%E7%A7%81%E3%81%AE%E9%96%8B%E7%99%BA%E4%B8%AD%E3%81%AE%E4%B8%BB%E3%81%AA%E6%B5%81%E3%82%8C "(番外編)私の開発中の主な流れ")
 - [初心者向けGithubへのPullRequest方法](https://qiita.com/samurai_runner/items/7442521bce2d6ac9330b "初心者向けGithubへのPullRequest方法")
 - [GitHubでPullRequestを使った開発フロー](https://qiita.com/NAKKA-K/items/072e28c3f3ad7178f3a4#%E6%B5%81%E3%82%8C "流れ")
 - [git develop, feature branch作成からmergeするまで (自分用メモ)](https://qiita.com/Naoki206/items/e5520453f92dcd4274f1 "git develop, feature branch作成からmergeするまで (自分用メモ)")
 - [git pull と git pull –rebase の違いって?図を交えて説明します!](https://kray.jp/blog/git-pull-rebase/ "git pull と git pull –rebase の違いって?図を交えて説明します!")
 - [Gitで不要なローカル・リモート追跡ブランチを削除するコマンドまとめ](https://www.engilaboo.com/delete-git-branch/ "Gitで不要なローカル・リモート追跡ブランチを削除するコマンドまとめ")
 - [GitHub Issueを用いた開発手順](https://zenn.dev/ogakuzuko/articles/2250f7c7331106 "GitHub Issueを用いた開発手順")