VSCodeでgit rebaseを使ってコミットをまとめる

# はじめに
`git`には`rebase`というコマンドが存在し、以下のようなことを行うことが出来ます。
1. 作業ブランチの親コミットを、最後尾に変更する。
1. 複数コミットを1つにまとめる。

本記事では「2. 複数コミットを1つにまとめる」を`VSCode`を使用して簡単に行う方法をご紹介します。

①例えば以下のように、`main`ブランチから`feature`ブランチを生やすとします。

![002_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/a93632de-f410-c6a8-fdfd-974dd0aeddb2.png)

②続いて、`feature`ブランチで以下のような2つのコミットを行いました。

![002_new_2_commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/7118016e-6bf2-f3fd-b638-32650f549ed8.png)

③最後に、`rebase`コマンドを使用してcommitA ~ C を1つのコミットにまとめます。

![003_rebase_commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/79488d01-8272-4cb6-f3de-69ca7faa8171.png)

ユースケースとしては、`Pull Request`を行う前にコミットをまとめることで、レビューする方が「結局変更点はどこなのか」を把握しやすくなります。

# 環境
- OS: Windows10
- VSCode: 1.87.0

# 実際に試す
## 準備
### リポジトリの作成
検証に適当なリポジトリの作成 ⇒ `git clone` を行います。
今回は`confirm_rebase`というリポジトリを作成しました。

### `Git Graph`のインストール
さらに、VSCodeの拡張機能の`Git Graph`をインストールしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/9b5c3e21-8afb-8e38-bf13-0d3644ce8ea7.png)

## ブランチ作成
現段階では、作成したばかりのリポジトリをクローンしてきただけですので、ファイルは`README.md`しかありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/663a2b7d-6505-b89c-320b-2a820ca2af20.png)

この状態で、`feature`ブランチを作成し、移動します。
```bash
git checkout -b feature
```

VSCode上で、現在のブランチが`feature`であることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/cb004353-8f69-1655-7467-8c55838a1c3e.png)

## `README`の編集を行う
`feature`ブランチで、複数のcommitA~Cを作成していきます。
### commitA
`README.md`を以下のように編集し、コミットします。
```README.md
# confirm_rebase
commitA
```
```bash
git add README.md
git commit -m "commitA"
```

VSCode上でコミットログを確認してみます。
画面左下の「Git Graph」をクリックすることで、現在のコミットログを確認することが出来ます。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/fb262a0f-c271-1071-665c-2f839f83e81d.png)

上記の流れに沿って、commitB, commitC を作成していきます。

### commitB
```README.md
# confirm_rebase
commitA

commitB
```
```bash
git add README.md
git commit -m "commitB"
```

### commitC
```README.md
# confirm_rebase
commitA

commitB

commitC
```
```bash
git add README.md
git commit -m "commitC"
```

この状態で、再度`Git Graph`を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/0a5658c4-ecda-0de6-8d4f-d5cc9824648e.png)

上記のように、commitA ~ commitC が作成できているのが確認できます。

## `git rebase`を行う
いよいよコミットをまとめる時が来ました。

まず`Git Graph`を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/e9c9b23c-000f-fc81-a9f2-c43725a48ea8.png)

その次に、**まとめたいコミットの1つ前のコミット**上で右クリックをします。
今回は commitA ~ commitC を1つにしたいので、`main/origin`上で右クリックを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/3ee22bf0-7e29-a8ec-70d8-2243774e66ac.png)

するとこのようにメニューが表示されますので、`Rebase curent branch on this Commit...`をクリックします。
![rebase_on_this_commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/81941a53-f24c-5866-542c-ae793bc147a8.png)

以下のようなメニューが表示されますので、
①「Launch Interactive Rebase in new Terminal」にチェックを入れる
②「Yes, rebase」をクリックする。
![check_rebase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/8633816b-1d43-f75d-1d59-ab3f14d52db9.png)

ターミナルに以下のような `rebase` に関する出力が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/e1dbb5a4-7720-eb6d-1b65-ef7c1533aff1.png)

上3行に、これまでに行ったコミット一覧が表示されています。
それぞれの頭に `pick` と記述されておりますが、**残したいコミット以外を `pick` ⇒ `s` に変更する必要があります。**

以下は `commitA` のみ残す場合の例です。
```vim
# 変更前
pick 903955e commitA
pick f9a18c1 commitB
pick c1c0de0 commitC

# 変更後
pick 903955e commitA
s f9a18c1 commitB
s c1c0de0 commitC
```

しかし、この状態でターミナル上に何か入力しようとしても、できません。
そこで、「i」を押下し「挿入モード」にすることで、編集ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/be8c2cab-0d91-8e29-0c0a-212d09fc130d.png)

編集後。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/1f696c11-a7e5-1b5a-0926-28c9011820ec.png)

ここまでできましたら、「Esc」キーを押すことで、「挿入モード」を解除できます。
さらに「:wq」と入力し、エンターを押下します。

すると、ターミナルの表示が以下のように変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/5adac1c7-cc2f-7f7b-3d8e-c8496d20bf28.png)

図のように、これまでに行ったコミットの際のコメントが全て表示されております。
（「commitA」~ 「commitC」）

先ほどと同様に、まとめるコミット以外のコメントの先頭に「#」を付けて、コメントアウトします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/240c8696-c8b9-79d4-ef7b-e1c69d62bb0b.png)

この状態で、再度「:wq」と入力し、エンターを押下します。
すると以下のような表示がされ、`rebase` が完了します。
```bash
[detached HEAD fbdce57] commitA
 Date: Thu Mar 7 14:38:44 2024 +0900
 1 file changed, 6 insertions(+), 1 deletion(-)
Successfully rebased and updated refs/heads/feature.
```

`Git Graph`を見てみますと、ちゃんとコミットが1つにまとまっているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/dc9a647a-c3ec-9138-0dc6-7842b7df33ab.png)

リモート環境に反映したい場合は、以下の `push` コマンドを行います。
```bash
git push -f
```

コミットが `commitA` のみであることが確認できます。
![remote.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/0074c726-b523-79bb-85c2-9d3a9f3dbe19.png)

お疲れ様でした。

# 最後に
`git rebase`コマンドのうち、コミットをまとめる方法に関してご紹介させていただきました。
内容的に間違っている箇所等ございましたら、ご教示いただけると幸いでございます。

# ご紹介
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area