gitコマンドを使ったブランチ作成からマージまでの流れ（GitHub Desktopとの比較あり）

※2022年から技術系の記事は[個人ブログ](https://yamaday0u.net/category/programmer/)に投稿しております。ぜひこちらもご覧ください→[yamaday0u Blog](https://yamaday0u.net/category/programmer/)

アプリ開発のバージョン管理に使うGitHubには、GitHub DesktopというGUIで操作できる便利なアプリがあります。

しかし、キーボードによるコマンド入力(CLI)で操作する方がGitHubの操作スピードが上がるため、ブランチ作成からマージまでの一連の流れを、一部GitHub Desktopの操作と比較しながらコマンドを覚えていきます。

注意：Ruby on Railsでの開発を前提としています。

## 新しいブランチを作成する・ブランチを切り替える
### git branch
`git branch`は作成済みのブランチを一覧表示します。
現在選択されているbranchは先頭に'*'が付いています。

```:ターミナル
git branch
  first-branch
* master
```
### git branch ブランチ名
新しいブランチを作成します。

```:ターミナル
git branch second-branch master //masterブランチからsecond-branchを作成
```
### git checkout ブランチ名
ブランチを切り替えることができます。

```:ターミナル
git checkout second-branch
Switched to branch 'second-branch'

git branch
  first-branch
* second-branch
  master
```
### git checkout -b ブランチ名
新しいブランチを作成した上で、そのブランチに切り替えることができます。

```:ターミナル
git checkout -b third-branch

Switched to a new branch 'third-branch'

git branch
  first-branch
  second-branch
* third-branch
  master
```

## ブランチをリモートに登録する
### git push -u origin 作成したブランチ名
作成したブランチをリモートリポジトリに登録します。
GitHub Desktopでいう`publish branch`ですね。

```:ターミナル
git push -u origin third-branch
Total 0 (delta 0), reused 0 (delta 0)
remote: 
remote: Create a pull request for 'third-branch' on GitHub by visiting:
remote:      https://github.com/ユーザー名/リポジトリ名/pull/new/third-branch
remote: 
To https://github.com/ユーザー名/リポジトリ名.git
 * [new branch]      third-branch -> third-branch
Branch 'third-branch' set up to track remote branch 'third-branch' from 'origin'.
```

GitHubでbranchを確認すると、ブランチが登録されているのがわかると思います。


## 変更したファイルをステージングする（コミットの対象にする）
### git diff HEAD
差分を確認できます。HEADは前回のコミットを意味しますが、記述しなくてもデフォルトで前回コミットとの差分を表示します。
たとえばRailsでusers_controller.rbとroutes.rbを更新した場合は以下のように表示されます。

```:ターミナル
git diff
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index a6d5714..4e32689 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -3,4 +3,8 @@ class UsersController < ApplicationController
     @user = User.find(params[:id])
     @items = Item.where(user_id: params[:id]).order('created_at DESC')
   end
+
+  def edit
+    @user = User.find(params[:id])
+  end
 end
diff --git a/config/routes.rb b/config/routes.rb
index a1e37f2..a545305 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -5,6 +5,6 @@ Rails.application.routes.draw do
     resources :purchases, only: [:index, :create]
   end
   devise_for :users
-  resources :users, only: [:show]
+  resources :users, only: [:show, :edit]
 end
```
GitHub Desktopでいうとこの状態ですね。
[![Image from Gyazo](https://i.gyazo.com/2f8bd4b0e7581f15408524f7085720de.png)](https://gyazo.com/2f8bd4b0e7581f15408524f7085720de)

### git addとgit diff --staged
ファイルに変更を加えたら、`git add ファイル名`でコミットの対象にするファイルを選びます。`git diff --staged`でステージングエリアのファイル（addされたファイル群）を確認できます。試しにroutes.rbをaddしてステージングエリアを確認します。

```:ターミナル
git add config/routes.rb 
git diff --staged
diff --git a/config/routes.rb b/config/routes.rb
index a1e37f2..a545305 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -5,6 +5,6 @@ Rails.application.routes.draw do
     resources :purchases, only: [:index, :create]
   end
   devise_for :users
-  resources :users, only: [:show]
+  resources :users, only: [:show, :edit]ml
 end
```
GitHub Desktopでいうとこの状態です。route.rbのみチェックマークが付いている状態です。
[![Image from Gyazo](https://i.gyazo.com/29f9cbf99d7d9481f55f47e15e578697.png)](https://gyazo.com/29f9cbf99d7d9481f55f47e15e578697)

また`git add .`を入力すると全ての変更されたファイルをコミットの対象にできます。
ちなみに、間違えてaddしてしまったファイルをステージングエリアから取り除きたい場合は以下のコマンドを入力します。

```
git reset HEAD 取り除きたいファイル名
```

## ファイルの変更をコミット&プッシュする
### git commit
ステージングエリアにあるファイルをコミットします。`-m "コメント"`オプションを記述することで、コミット時のコメントも一緒に登録できます。

```:ターミナル
git commit -m "Add edit action to users routes"
[third-branch(現在のブランチ名)] Add edit action to users routes
 1 file changed, 1 insertion(+), 1 deletion(-)
```
### git push
リモートリポジトリのmasterブランチにプッシュします。

```:ターミナル
git push
```
GitHub DesktopのPush originにあたります。
[![Image from Gyazo](https://i.gyazo.com/52f46958f09d2bb1a725da353a60b5ad.png)](https://gyazo.com/52f46958f09d2bb1a725da353a60b5ad)

## プルリクエストを作成する
gitコマンドでプルリクエストを作成する方法が分からないので、これまで通りこのステップはGitHub上で行います。

## マージする
プッシュ後、リモートリポジトリのmaster(origin)にマージする方法は調査中のため、、このステップもGitHub上で行います。

## プルする
マージ後のリモートリポジトリのmaster(origin)をローカルリポジトリのmasterにpullするコマンドは以下の通りです。

```:ターミナル
git checkout master
git fetch
git merge
```

## ブランチの削除
### git branch --delete
最後に、マージしたローカルブランチを削除します

```:ターミナル
git branch --delete third-branch(削除したいブランチ名)
```
リモートリポジトリのブランチを削除する場合は以下のコマンドを入力します。

```:ターミナル
git push --delete origin third-branch(削除したいブランチ名)
```

以上で、ブランチ作成からマージまでの流れが完了しました。
gitコマンドを使った最低限の流れを書いたので、ここから少しずついろんなgitコマンドを使えるようになりたいですね！

## 参考資料
[Git Documentation Reference Manual](https://git-scm.com/docs)
[Git基本操作。ローカルでの作業からリモートリポジトリのマージまで。](https://note.com/koushikagawa/n/n56d158125ee9)
[git push コマンドの使い方と、主要オプションまとめ](https://www.www-creators.com/archives/1472)
Qiita
[gitのブランチ作成〜リモートへの登録(git checkout ~ git push -u origin)](https://qiita.com/shungo_m/items/4bbcbcbd3d7aea40b21e)