はじめに
Gitを使っていると、コミットをまとめたい ときがあります。
例えば、「Greeter(挨拶)クラス」に「goodbye(別れを告げる)メソッド」を実装した場合に、以下のようにコミットが行われたとします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F56b6120d-b573-2c43-0197-8604f1404d46.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f53fcec6251986add719980b270af7c9)
「Greeterクラス」の「goodbyeメソッド」は新しく実装されたため、実装〜リファクタリング までのコミットは goodbyeメソッドの実装コミット としてまとめるべきです。
⬇ こうしたい ⬇
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F5c7510f5-86ad-4687-6300-2a19f954aa21.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=fa5de78eff92b9a7d18a73b0379a768f)
ただ、Gitのコミットをまとめるために git rebase
しないといけないのか・・
と思い、その作業が手間に感じて「コミットしてしまおう!!」となり、そのままコミット&プッシュされてしまい、Gitのコミットログを散らかしてしまう ことがあります。(かつての自分はそうでした😅)
git rebase
は、コミットをまとめるためのコマンドですが、コマンドラインで操作するのは手間がかかります。
そこで、Visual Studio Code の拡張機能 を使って、コミットをまとめる作業を GUIベース で簡単に行う方法を紹介します。
使用する拡張機能
コミットをまとめるために使用するのは、Visual Studio Code の拡張機能である GitLens と Git Graph です。
GitLens は、Gitの情報を表示するための拡張機能で、Interactive Rebase Editor という機能が備わっており、これを使用することで GUIベースの操作 でコミットをまとめることができます。
Git Graph は、Gitのコミットログをグラフィカルに表示するための拡張機能で、GitLens と組み合わせて使用することで、コミットログの操作がしやすくなります。
コミットをまとめてみる
ここからは実際に GitLens の Interactive Rebase Editor を使ってコミットをまとめる方法について説明します。
準備
自身の環境にあるGitリポジトリを使用しても問題ありませんが、環境を汚さずにリベースを体験できるように Playgroundリポジトリ を作成しました。
Playgroundリポジトリは、Gitのコミットをまとめる作業を体験するために必要な「拡張機能」や「サンプルコード」が入っているので、以下の手順で準備を行ってください。
1. Playgroundリポジトリをクローンします
以下のコマンドを実行して、Playgroundリポジトリをクローンしてください。
git clone https://github.com/sakes9/git-rebase-playground.git
2. Playgroundリポジトリをクローンしたフォルダを「VSCode」で開きます
3. 拡張機能をインストールします
Visual Studio Code で Playgroundリポジトリのフォルダを開くと、拡張機能のインストールポップアップ が出るので、「インストール」をクリックすると必要な拡張機能がインストールされます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F0c06bcdf-8d9d-afc4-c664-de4e99a31f85.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=dcd604cc2e1fa16ab28417112f29bd08)
これで準備は完了したので、Interactive Rebase Editor を使ってコミットをまとめてみましょう。
コミットする
まずは、まとめる対象のコミットを作成します。
1. Greeter(挨拶)クラスが既にサンプルとして実装されているため、そのクラスに goodbye(別れを告げる)メソッド を追加します。
class Greeter {
/**
* あいさつをする
* @param to あいさつをする相手
*/
hello(to: string): void {
const name = to;
console.log(`こんにちは ${name} さん`);
}
+ goodbye(to: string): void {
+ const name = to;
+ console.log(`さようなら ${name} さん`);
+ }
}
export { Greeter };
2. 変更をコミットします
VSCodeのソース管理をクリックする
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2Fcb98016d-f3a2-d183-93d3-802d75ed802d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b9c5015d004c43fce6700938f337acc3)
「+」をクリックして変更をステージングする
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F9a914818-7f58-ac5b-2f9b-bece257a17bd.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e8597f5785d35754417ae1f590352b17)
変更がステージングされました。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2Fbfeaa0f0-f3d0-42b6-326c-a450fff5867f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=8d6218cd316aa35f677a096bd44e2b8f)
Commitizen という、Gitのコミットメッセージを対話形式で作成するためのツールを使ってコミットメッセージを作成します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2Fd2fa28b8-3082-6e13-985f-014b66b843c5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5b6084803f9f7c84977698e7d0a60524)
コミットメッセージの種類を選択します。
新機能の追加なので、feat: 新機能の追加
を選択します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2Fe7437696-969e-eb04-0427-943c38482fea.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e1fa29191bf5b822476aef1c40013d2d)
「コミット内容について入力してください」のプロンプトで以下を入力して Enter を押します。
Greeterクラスに「別れを告げる」メソッドを実装する
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F68c82fdd-666c-3578-73e6-1cb02aafc543.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=994a8035c3908ac0ba807975b42e44d2)
「コミット内容の詳細について入力してください」のプロンプトで Enter を押して、コミット詳細の入力をスキップします。
3. メソッドコメントを追加する
goodbyeメソッドに コメント を追加します。
class Greeter {
/**
* あいさつをする
* @param to あいさつをする相手
*/
hello(to: string): void {
const name = to;
console.log(`こんにちは ${name} さん`);
}
+ /**
+ * 別れを告げる
+ * @param to 別れを告げる相手
+ */
goodbye(to: string): void {
const name = to;
console.log(`さようなら ${name} さん`);
}
}
4. 変更をコミットします
メソッドの実装コミットと同様に Commitizen を使用してコミットしていきます。
コミットメッセージの種類を選択します。
コメントの追加なので、bulb: コメントの追記
を選択します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F2ffefea1-8b3b-d0d8-a22e-383d187811b7.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=dd2ad871f2c5c236a020918e823f1127)
「コミット内容について入力してください」のプロンプトで以下を入力して Enter を押します。
Greeterクラスの「別れを告げる」メソッドにコメントを記入する
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F7f06513a-206f-65f5-1478-d254a799306a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=6534a179c970a437a37cea754ed9f398)
「コミット内容の詳細について入力してください」のプロンプトで Enter を押して、コミット詳細の入力をスキップします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2Fbed48a7d-9b25-10c4-72e5-3dc5cc14f112.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d063c1f272f0371aa15556f47e55a026)
これでコミットが完了したので、Interactive Rebase Editor を使ってコミットをまとめてみましょう。
Interactive Rebase Editor でコミットをまとめる
1. Git Graph を開きます
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F92620563-96e9-8f4b-1abb-d82c63409732.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f1e2d80dd0b61e3396cef9eef5769480)
2. リベース対象のコミットの 1つ前のコミット 右クリックして、「Rebase current branch to this Commit...」を選択します
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F2b45d9eb-5ee6-1d9a-a039-f021d0e15dd5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c33a312538f15f3ee7ed69c4cc6035d4)
3. 「Launch Interactive Rebase in new Terminal」にチェックを入れます
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F7b5d755c-6c4c-d577-5f40-0500adb91932.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d9b66dc116298d35b73fca223ed20972)
4. rebaseオプションを選択します
まとめるコミットのrebaseオプションに「squash」を選択して「START REBASE」をクリックします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F0fcab13c-a21b-47e8-961c-233d9a7e703b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=22ef8dc8ba310bcf8ff17be858386fda)
5. コミットメッセージを編集します
「COMMIT_EDITMSG」ファイルが開くので、bulb〜のコミットメッセージを削除して、ファイルを保存します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F6467fa0d-5771-d590-b3fd-5057082fbf0d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a3e2e82b956c66c8404dc1546f7d7cc5)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F99c6f9ad-1bb2-33d8-2337-23cb8f380433.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=02f7dd44675b4d6c1455aa7dfa2c6aa2)
6. 「COMMIT_EDITMSG」ファイルを閉じると、コミットがまとめられます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3087076%2F5c7510f5-86ad-4687-6300-2a19f954aa21.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=fa5de78eff92b9a7d18a73b0379a768f)
リベース時にStashを自動で行う
変更中のファイルがある場合は、それらの変更をスタッシュ(一時退避)してからリベースする必要があるため、毎回スタッシュを手動で行うのは手間になります。
リベース時にスタッシュを自動で行うGitの設定をしておくと、Gitコミットをまとめる作業がストレスなくできます。
git config --global rebase.autostash true
まとめ
Visual Studio Code の GitLens と Git Graph を使って、コミットをまとめる作業を GUIベース で簡単に行う方法を紹介しました。
コミットログがまとまっていると、コードの変更履歴が見やすくなり、コードレビューやバグなどの原因究明に役立つので、ぜひ活用してみてください。