VSCode

VSCodeでGitのrebaseを実施する方法

VSCodeでGitのrebaseを実施する方法

VSCodeでGitのrebaseを実施する方法について解説します。

Gitのrebase

rebaseとは

Gitは、プログラムソース等のバージョン管理ソフトウェアです。rebaseとは、Gitで提供されるコマンドの一種です。

似たコマンドとして開発ブランチをまとめるmergeというコマンドがありますが、こちらは感覚的にも理解しやすいのに対して、このrebaseというコマンドは取り扱いが少し難しいコマンドです。

rebaseコマンドを一言で表すと「コミットをつなげなおしたり、ひとまとめにしたり、コミットメッセージを修正したりして、ログを綺麗にする」コマンドです。

本記事では、コードエディタのVSCodeを使いつつ、rebaseコマンドを実行して使う方法について、いくつかの主要な使い方に絞って図を用いながら紹介していきます。

VSCodeを用いてGitのrebaseを実行する方法

ここからは、コードエディタであるVSCodeを使ってGitのrebaseを実行する方法を紹介します。

前提として、VSCodeの拡張機能であるGitLensGitGraphを使用しています。VSCodeの拡張機能としてインストールしておいてください。インストール方法が分からない方は、本記事内にこちらにインストール方法の参考を設けていますので、確認してインストールしてください。

rebaseでのよくある主要な使い方

rebaseはいくつかの使用ケースが考えられるかと思いますが、よくある主要な使い方だと思われる以下の3種類の方法について、概要図なども交えて紹介していきます。

  1. 開発コミットをつなげなおす
  2. 複数コミットを一つにまとめる
  3. コミットメッセージを修正する

開発コミットをつなげなおす

一つ目の例として、開発コミットをつなげなおす例を紹介します。具体的には、以下の図でブランチAとブランチBのように複数のブランチで開発コミットしていた時に、ブランチAの後ろにブランチBをつなげなおすことを考えてみたいと思います。

rebase 開発コミットをつなげなおす

上記の例は、startの位置でブランチAとブランチBが作成されてそれぞれで開発を進めた場合を示しています。

では、具体的にVSCode上でどのような手順を実施するか見ていきましょう。以下が実際に上記のような状況でのGitGraphのコミットグラフです。このコミットグラフの状態からブランチAの後ろにブランチBをつなげる手順を見ていきましょう。

rebase 開発コミットをつなげなおす

まず、ブランチBがチェックアウトされている状態で、ベースとなるブランチA上で右クリックし、「Rebase current branch on this commit…」をクリックします。

rebase 開発コミットをつなげなおす

以下のようなダイアログが出るので、「Launch Interactive Rebase in new Terminal」にチェックを入れて「Yes, rebase」をクリックします。

rebase 開発コミットをつなげなおす

すると以下のようなGitLens Interactive Rebase画面が表示されます。各行がコミットを表していてプルダウンでいくつかの処理が選べます。「pick」は何もせずそのまま使うという意味で、今回はコミット自体には変更等加えずに、つなぎ変えるだけですのでpickを選んだ状態で「START REBASE」をクリックします。もしくは「Ctrl + Enter」でも実行できます。なお、処理をやめたいときは「ABORT」をクリックしてください。

rebase 開発コミットをつなげなおす

Rebaseを実行するとVSCodeのターミナルで以下のような表示がされます。「git rebase」というのがコマンドが実行されて、成功していることが分かります。

git rebase --interactive c219f6ef4154eb71753828a641795630a38384e2

Successfully rebased and updated refs/heads/branch-B.

GitGraph上で更新ボタンを押すとグラフが更新されます。

rebase 開発コミットをつなげなおす

上記のように、Aの後ろにつなぎなおされて一直線のきれいなコミットグラフになったことが分かります。

複数コミットを一つにまとめる

次に、複数コミットを一つにまとめる例を紹介します。コミットは開発にそって適宜実施していくわけですが、後から見ると複数のコミットをひとまとめのコミットにしておいた方が変更内容が理解しやすく、すっきりとするような場合がよくあります。

このような際には、rebaseを使って以下の図のようなイメージで複数コミットを一つにまとめることができます。

rebase 複数コミットを一つにまとめる

上記は、もともとa~dまであったコミットをまとめてeという一つのコミットにまとめているような例を示しています。

では、具体的にVSCode上でどのような手順を実施するか見ていきましょう。以下が実際に上記のような状況でのGitGraphのコミットグラフです。このコミットグラフで、ファイル作成~変更1, 2, 3のコミットを一つにまとめてみましょう。

rebase 複数コミットを一つにまとめる

まず、ブランチAがチェックアウトされている状態で、変更したい範囲の一つ前のコミットを右クリックし、「Rebase current branch on this commit…」をクリックします。

rebase 複数コミットを一つにまとめる

以下のようなダイアログが出るので、「Launch Interactive Rebase in new Terminal」にチェックを入れて「Yes, rebase」をクリックします。

rebase 複数コミットを一つにまとめる

すると以下のようなGitLens Interactive Rebase画面が表示されます。各行がコミットを表していてプルダウンでいくつかの処理が選べます。今回は、コミットを統合するので統合するコミットを「squash」に変更して、「START REBASE」をクリックします。もしくは「Ctrl + Enter」でも実行できます。なお、処理をやめたいときは「ABORT」をクリックしてください。

rebase 複数コミットを一つにまとめる

すると、GITで設定されているエディタが起動し以下のような画面になります。この例ではVSCodeが起動している例です。この画面ではコミットメッセージの変更をすることができ、#から始まる行はコミットメッセージとしては無視されます。

rebase 複数コミットを一つにまとめる

今回は、一つにコミットをまとめたメッセージにしたいので以下のように変更して保存し、「×」で閉じると処理が継続します。

rebase 複数コミットを一つにまとめる

Rebaseを実行するとVSCodeのターミナルで以下のような表示がされます。「git rebase」というのがコマンドが実行されて、成功していることが分かります。

git rebase --interactive 8f9c37b185f75ae5944cc05ea607290e3b93b14f

[detached HEAD 1e405dd] branch-A: ファイル作成&変更
 Date: Sun Nov 13 09:43:39 2022 +0900
 1 file changed, 3 insertions(+)
 create mode 100644 testA.py
Successfully rebased and updated refs/heads/branch-A.

GitGraph上で更新ボタンを押すとグラフが更新されます。

rebase 複数コミットを一つにまとめる

上記のように、複数あったコミットが一つのコミットにまとめられていることが分かるかと思います。

コミットメッセージを修正する

Gitでコミットをしていると、たまにコミットメッセージを間違えたり、書くべき事項が足りなかったりといったケースがよく発生します。

このような際には、rebaseを使って以下の図のようなイメージでコミットメッセージを修正することができます。

rebase コミットメッセージを修正する

上記の例は、cの部分のコミットメッセージで変換ミスをしてしまった場合を示しています。

では、具体的にVSCode上でどのような手順を実施するか見ていきましょう。以下が実際に上記のような状況でのGitGraphのコミットグラフです。このコミットグラフの状態からコミットメッセージを修正する手順を見ていきましょう。

rebase コミットメッセージを修正する

まず、ブランチAがチェックアウトされている状態で、変更したい範囲よりも前のコミットを右クリックし、「Rebase current branch on this commit…」をクリックします。

rebase コミットメッセージを修正する

以下のようなダイアログが出るので、「Launch Interactive Rebase in new Terminal」にチェックを入れて「Yes, rebase」をクリックします。

rebase コミットメッセージを修正する

すると以下のようなGitLens Interactive Rebase画面が表示されます。各行がコミットを表していてプルダウンでいくつかの処理が選べます。今回は、コミットメッセージを修正する対象のコミットを「reword」に変更して、「START REBASE」をクリックします。もしくは「Ctrl + Enter」でも実行できます。なお、処理をやめたいときは「ABORT」をクリックしてください。

rebase コミットメッセージを修正する

すると、GITで設定されているエディタが起動し以下のような画面になります。この例ではVSCodeが起動している例です。この画面ではコミットメッセージの変更をすることができ、#から始まる行はコミットメッセージとしては無視されます。

rebase コミットメッセージを修正する

今回は、rewordに設定したコミットメッセージが表示されます。コミットメッセージを修正して保存し、「×」で閉じると処理が継続します。今回の例ではrewordに設定したのが一つのコミットでしたが、複数の場合は順次同様に変更します。

rebase コミットメッセージを修正する

Rebaseを実行するとVSCodeのターミナルで以下のような表示がされます。「git rebase」というのがコマンドが実行されて、成功していることが分かります。

git rebase --interactive 6291c81b14f50c98978dbe4287cfc8571148644f

[detached HEAD 6755a18] branch-A: ファイル変更2
 Date: Sun Nov 13 10:47:00 2022 +0900
 1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/branch-A.

GitGraph上で更新ボタンを押すとグラフが更新されます。

rebase コミットメッセージを修正する

上記のように、誤っていたコミットメッセージが修正されたことが分かるかと思います。

rebaseのその他の処理

rebaseで上記でも使用してきたpick、squash、reword等がありますが、他にもありますので表でまとめておこうと思います。今回は主要な処理に絞ってということで一部しか紹介しませんでした。必要に応じて各処理の方法を調べてもらえるとよいかと思います。

処理内容
pick何もしないで選択する
rewordコミットメッセージをまとめて変更する
edit過去のコミットを修正する(該当箇所でrebaseを一時停止する)
squash過去のコミットを統合する(コミットメッセージを変更する場合)
fixup過去のコミットを統合する(コミットメッセージの変更が不要な場合)
drop過去のコミットを削除する

mergeとrebaseの使い分け

mergeコマンドとrebaseコマンドの大きな違いは、「既存のコミットに影響を与えるか否か」という点です。mergeコマンドを使うと、merge commitとして新しいコミットを作成するので既存のコミットに影響を与えることはありません。

そのため、複数の開発メンバーにて、共同開発をしている環境で安易にrebaseしてしまうと他の人のコミットを勝手に作り直してしまうというようなことが発生してしまう可能性もあります。

そのため、まだリモートリポジトリにpushしていない段階のローカルリポジトリ内でコミットの内容を修正するのにはrebaseを使うようにするとよいと思います。一方で、pushした後で他の人も見ている・ソースを修正しているような場合については、mergeを使用するようにしましょう。共同開発環境ではpull requestを通じて検証をしつつmergeするというのが一般的かと思います。

【参考】Git拡張機能のインストール

GitGraphのインストール

GitGraphは、Gitのコミットグラフをきれいに表示するためのVSCode拡張です。以下のように拡張タブからインストールしてください。

GitGraph

インストールすると、ソース管理タブのところから以下のボタンを押すことでGitGraphによるコミットグラフを表示することができます。

GitGraph

GitLensのインストール

GitLensは、Gitの変更情報などをVSCode上で確認したりするのに非常に便利な拡張機能です。以下のように拡張タブからインストールしてください。

GitLens

GitLensを導入すると、ソースコード上にファイルの変更時刻や各行が最後に変更された際のコミットメッセージなどをソース上でも確認できるようになります。

GitLens

他にもgitの変更情報を以下のようにコミットメッセージと並べて見たりなど、色々とGitのコミット情報を確認してプログラミングを進めるのに便利な機能が提供されています。

GitLens

今回の記事では、上記で紹介している例のように「GitLens Interactive Rebase」ということでrebaseのコマンドをGUIでできる機能を使用しています。

まとめ

VSCodeでGitのrebaseを実施する方法について解説しました。rebaseとは、Gitで提供されるコマンドの一種です。

rebaseはいくつかの使用ケースが考えられるかと思いますが、よくある主要な使い方だと思われる以下の3種類の方法について、概要図なども交えて紹介しています。

  1. 開発コミットをつなげなおす
  2. 複数コミットを一つにまとめる
  3. コミットメッセージを修正する

rebaseは、gitコマンドの中でも扱いが少し難しいものであると感じますが、コミットログを綺麗にする際にとても便利ですので、参考にしていただければと思います。