Git, GitHubを使用してGit-Flowを構築する

# 概要
　共同開発やポートフォリオとしてソースコードを公開することを念頭に置いたアプリケーションを開発する場合、GitHubで管理することが必要となる。その際に発生するGitHubとGitの初期設定についてまとめた。今回はGit-Flowに基づいた開発をすることを想定し、開発を始めるまでを構築していく。このやり方は一例であり、他にもやり方はあると思いますので参考までに。

# Git-Flowについて
　Git-Flowについての記事はよく見かけるため、ここでは簡単に説明する。大まかにmainブランチ、releaseブランチ、developブランチ、featureブランチが存在する。

- mainブランチ
    - 常にリリース可能である安定したブランチ
- releaseブランチ
    - リリースが行わる際に発生するブランチ
    - リリースバージョンの付与などを行う
- developブランチ
    - 開発の中心となるブランチ
    - featureブランチの組み込みブランチとしての役割を持つ
- featureブランチ
    - developから機能開発を行う際に作成されるブランチ
    - 基本的には何か変更行う際にはまずfeatureブランチを作って変更を行い、終わったらdevelopにマージするというプロセスが一般的
     
　**Git-Flowでは、用途に応じた様々なブランチが存在するが、今回は開発を始めるための最低限の必要なmainブランチ、developブランチ、featureブランチの作成について述べる。**

# 1. GitHubでの設定
- リモートリポジトリの新規作成
    - リポジトリ名、説明文を記載。
    - 公開するのか、公開しないのかを選択
    - README.md, .gitignore, licenseファイルは今の段階では作成しない
    - 記入出来たら"create repository"を押す
    

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717054/bfccfc6b-f5ba-c897-79e4-650bcce14311.png)

# 2. Gitでの設定
### 2.1 リモートリポジトリをクローンする
1.で作成したリポジトリをクローンする。

```shell:shell
$ git clone https://github.com/Yuki-TU/next.git
Cloning into 'next'...
warning: You appear to have cloned an empty repository.
```

### 2.2 README.mdファイルの追加・編集
　README.mdファイルを作成する。README.mdは、リポジトリの概要や説明をするためのファイルであり、マークダウン記法に則って記述することができる。

```shell:shell
$ touch README.md
$ nano README.md     # 好きなエディタで編集
```

```md:README.md（例）
# 概要
これはnext.jsによるプロジェクトです
```

### 2.3 コミットする
　作成したファイルをコミットする。

```shell:shell
$ git add .
$ git commit -m "README.mdの追加"
```

### 2.4 GitHubにpushする
　mainブランチにリネームし、pushする。pushは、ローカルブランチのリポジトリをリモートリポジトリにアップロードするときに使用するコマンドである。ここでは、`origin`がリモートリポジトリのURLを表している。

```shell:shell
$ git branch -M main       # ブランチ名をmainにリネーム
$ git push -u origin main  # -uはリモート追跡ブランチを作成するオプション
```

# 3. 再びGitHubでの設定
　GitHubの該当リポジトリを見ると、mainブランチが更新されていることがわかる。Git-Flowでは、mainブランチは品質が保証されたリリース用ブランチであり、普段開発を行うブランチはdevelopブランチの方を使用する。以下、developブランチを作成する手順を示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717054/51ac47bf-e89d-dc66-5882-27e2f2645cb0.png)


### 3.1 developブランチの作成
　create a branchより、mainブランチよりdevelopブランチを作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717054/718ffc1b-2a64-4caa-a20b-a48a54ce2c71.png)

### 3.2 developブランチをデフォルトブランチに設定する
開発する際のメインブランチはdevelopブランチであるため、デフォルトブランチをdevelopブランチに設定する。GitHubの各種リポジトリのsetting->branch->default branchより変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717054/c93f44f8-62c5-1ea0-bff2-f4e74d8ffd92.png)

# 4. ローカルにdevelopブランチを落としてくる
　以下のコマンドを実施することで、developブランチをローカルブランチとして保存することができる。

```shell:shell
$ git fetch         # リモート追跡ブランチの更新
$ git branch -a     # リモート追跡ブランチとローカルブランチの表示
* main
  remotes/origin/develop
  remotes/origin/main
$ git switch -c develop remotes/origin/develop   # リモートリポジトリで作成したdevelopブランチをdevelopという名前でローカルに保存
$ git branch       # ローカルブランチの表示
* develop
  main
```

# 5. featureブランチの作成
　最後にfeatureブランチの作成について述べる。まず、developブランチに移動する。そして、pullコマンドを実行して、developブランチを最新の状態にする。次に、developブランチからfeatureブランチ（下記例ではブランチ名：feature/issue#1/create_base_app)を作成し、featureブランチに移動する。この状態で機能を実装するソースコードを記述する。

```shell:shell
$ git switch develop      # developブランチに移動
$ git pull                # fetch + merge(通常はdevelopブランチは最新の状態にする)
$ git switch -c feature/issue#1/create_base_app     # developブランチよりfeatureブランチを切って移動
```

# 最後に
　以上で、developブランチとmainブランチ、featureブランチを作成することができた。あとは、featureブランチ上でコードを作成し、プルリクエスト送り、developブランチにマージするという開発を行えばよい。
　間違っている個所等ございましたら、コメントいただけると幸いです。

# 参考
https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0#remotes%E3%81%A3%E3%81%A6%E4%BD%95

https://www.atlassian.com/ja/git/tutorials/comparing-workflows/gitflow-workflow

https://tracpath.com/works/development/git_flow_and_github-flow/