初学習者でも使いたいgitとgit-flow

# はじめに
最近、やっとこさgitに慣れてきました。ただこんなことが起こったんですよね。ミスがあって振り返りしてる時に「ブランチ消しちゃったし、どのコミットで何をしたのかわからない」と。ということで、せめて`Issue`を立てて管理しつつ、ついでに`git-flow`も勉強してみよう！と思った次第です。
(注意：自分自身も初学習者です。何かあればコメントお願いします！)

# 追記
これ、ローカルで切って完成形の`develop`をプッシュするのもあるんですね。自分はどちらかがわからないのでわかる方は教えてください。

# 下準備

リポジトリを用意しましょう。(クローンしてきてそのまま利用する場合は、飛ばして大丈夫です)
リポジトリ作成時にあるやつが乗ってるだけです。可能ならgithubの方を参考にしてやってみてください。

```
$ echo "# リポジトリ名" >> README.md
$ git init
(既に初期ファイルを用意している場合)
$ git add *
(これからファイルを用意する場合)
$ git add README.md
# 以降は共通
$ git commit -m "initial commit"
$ git remote add origin リポジトリのURL
$ git push -u origin master
```

これでリポジトリの準備は完了です。それではgit-flowを試していきましょう。

# git-flow

インストールしておかないと使えないので、まずはインストールしていきましょう。Macならbrewでインストールすることができます。

```
# インストールされているかの確認
$ brew list | grep git-flow
# インストール方法
$ brew install git-flow
```

### git-flowの初期化
リポジトリを用意した時に、初期化しましたね。同様にgit-flowも初期化してあげましょう。

```
$ git flow init 
```

Enter連打で大丈夫です。作成されたブランチを確認してみましょう。

```
$ git branch -a
* develop
  master
  remotes/origin/master
```

`develop`が追加されていますね。また`*`がついていることにより、`develop`ブランチにいることがわかります。`remotes`をみてください。これからわかることは、現在`master`ブランチしかリモートには登録されていません。`push`して登録してあげましょう。

```
$ git push origin develop
```

最後に登録されているかの確認です。

```
$ git branch -a
* develop
  master
  remotes/origin/develop
  remotes/origin/master
```

# Issueを立てよう

さあ、ここまできたら`feature/`でどんどん開発していこうとこれまでの自分はなっていました。おかげで振り返ることはできないけど、大量にコミットされた訳の分からないリポジトリができるという悲劇を起こしました。はい、`Issue`を立てましょう。

先ほど立てたリポジトリへいき、`Issue`から`New issue`をクリックして作成ページへ飛びましょう。

まず、こちらを確認してみたください。
[開発者のタスク管理をGitHubで行ったらうまくいった話](https://dev.classmethod.jp/articles/github-issue-driven-dev/)

自分は以下のようにしました。

1つ目
Title欄
`CRUDの作成`

```
# 概要
CURD機能を作成する

## タスク
- [ ] データベースのテーブルの作成
- [ ] データを扱うモデルの作成
- [ ] リクエストを扱うコントローラーの作成
- [ ] 表示するビューの作成

```

2つめ
Title欄
`データベースのテーブルの作成`

```
## 概要
データベースのテーブルを作成する

## 親課題
#1 CRUDの作成

## タスク
- [ ] migration してテーブルの素を用意
  - [ ] users テーブルのmigration
  - [ ] articles テーブルのmigration
  - [ ] tags テーブルのmigration
  - [ ] article_tag テーブルのmigration
- [ ] migrate してテーブルを作成
```

それでは`Issue`を立てることができたので、実際に作業していきましょう。

# ブランチを切る

#### ブランチを切る前に

それでは、作業をしていくブランチを作成しましょう。今回はgit-flowなのでコマンドが少し変わってきます。

```
$ git flow feature start <ブランチ名>
```

自分はこんな風にしました。

```
$ git flow feature start db_migrations_#2
```

確認

```
$ git branch -a
  develop
* feature/db_migrations_#1
  master
  remotes/origin/develop
  remotes/origin/master
```

リモートには反映されていないので`push`しましょう。

```
$ git flow feature publish #2_db_migrations
```

一応。リポジトリの最新の状態を`pull`する方法。

```
$ git flow feature pull origin db_migrations_#2
```

# 作業開始

ブランチを用意したので、やっと開発ができますね。特に変わったことはありません。

```
# ファイルやフォルダが増えた
$ git add *
$ git add ファイル名

# コミット
$ git commit -m "コメント"

```

pushのやり方は２種類あります。

```
# git flow を用いる場合
$ git flow feature publish db_migrations_#1

# どちらかでpush
$ git push origin feature/db_migrations_#1
$ git push origin HEAD
```

コミットメッセージはここを参考にしています。
[Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364)

# プルリクエスト

せっかく`Issue`も立てて、管理できるようにしたんですから関連づけたいですよね。プルリク画面の右側の下から2番目に`Linked issue`というものがあります。そこから選択しましょう。

また、`Merge pull request`のコメント欄内に、`close #2`を付け足しておきましょう。マージされるときに、自動で`Issue`が閉じられます。

最後に、マージした後のブランチは削除してしまいましょう。

# ローカルでやること

最初の方に`git flow start`したので、終えないといけません。以下のようになります。

```
$ git flow feature finish db_migrations_#2
```

あと、残っているリモートブランチの削除もしてしまいましょう。

```
# 確認
$ git remote show origin
# 削除
$ git remote prune origin
```

リモートの最新の状態を取得しておきましょう。`develop`のブランチから取得します。

```
$ git fetch origin develop
$ git merge origin/develop
# 2つを1度に行う場合
$ git pull origin develop
```

リリースについては、参考の方を確認お願いします。

# 感想
featureと接頭辞をつけてブランチを作成するのはとても面倒くさかった。あとローカルのブランチの削除も。そこが解決されたのが個人的にとても嬉しい。今度は、`project`なんて機能も使ってみたい。
[新入社員におくるGitHubでのプロジェクト管理の初歩](https://qiita.com/gumimin/items/63dcb36d4730213bd63a)

あと、すでに作成されているブランチを取得したい場合などはここが参考になります。

・[図とコマンドで分かる！ git-flowによる開発の流れと使い方 (1/2)](https://www.atmarkit.co.jp/ait/articles/1401/06/news013.html)

## 参考
公式チートシート
・[git-flow cheatsheet](http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html)
参考
・[git-flowを試す](https://qiita.com/tanishi/items/09e72c65c0a0c9e1cc10)
・[コマンドラインでGit Flowをインストールして使ってみる](https://qiita.com/CarlBrown23/items/84a6c1ce82f602eaa5a6)
・[Git-flowって何？](https://qiita.com/KosukeSone/items/514dd24828b485c69a05)
・[git-flowで用いるブランチまとめ](https://qiita.com/hatt0519/items/23ef0866f4abacce7296)
・[GitHubでPullRequestを使った開発フロー](https://qiita.com/NAKKA-K/items/072e28c3f3ad7178f3a4)
・[GitHubのissueとcommitを紐付ける](https://qiita.com/cotolier_risa/items/210db74e6496d4359be7)
・[git-flowを用いた開発フロー](https://qiita.com/ueueue0217/items/274fba0dff12d1e124b9)