🛰️

GitのCommitをまとめるgit rebaseをVSCodeでGUIで簡単に実行する

2024/02/17に公開

はじめに

「コードをリファクタリングしたら、たくさんコミットが溜まってしまった...」
「機能追加の途中で細かすぎるコミットをしてしまった...」
そんな経験はありませんか?

そんなときに便利なのが
git rebase -i <commit id>
というコマンドなのですが、
CLIでの操作がなかなか面倒だなあと感じます。

VSCodeで開発している方向けに、GitLensプラグインを活用することで
GUI操作で簡単にできることがわかったのでまとめようと思います。

事前準備

Gitの基本的な操作に慣れていることを前提とします。まず、VSCodeとGitLensプラグインをインストールしましょう。

VSCodeのインストール

VSCodeは公式サイトからダウンロードできます。

GitLensプラグインのインストール

VSCodeの拡張機能からGitLensを検索し、インストールしてください。

VSCodeとGitlensを使ったrebaseの手順

GitLensプラグインを使うと、VSCode内で直感的にgit rebase操作を行えます。

CLIでブランチを切り替え

git checkout ブランチ名にて、コミットをまとめたいブランチに切り替えておきます。
git log --onelineでコミットログの履歴を確認しておきましょう。

今回のサンプルでは2~6のコミットを一つにまとめます。

change6
change5
change4
change3
change2
↓
change2

GitLensのInteractive Rebase Editorを有効化

  1. shift + cmd + p でVSCodeのコマンドパレットを開く
  2. rebaseと入力
  3. GitLens: Enable Interactive Rebase Editor をクリック

GitLensのGit Rebaseを起動

  1. shift + cmd + p でVSCodeのコマンドパレットを開く
  2. rebaseと入力
  3. GitLens: Git Rebase... をクリック

ブランチの選択

コミットをまとめたいブランチを選択します。

コミットの選択

親にしたいコミット(change2)の一つ古いコミット(change1)を選択します。

change6
change5
change4
change3
change2
↓
change2

Interactive Rebaseを選択

以下のようなGUIが表示される! 見やすい!!

squashに変更してSTART REBASE

合体して無くなってほしいコミットをpickからsquashに変更します。
親となるコミット(change2)だけpickのまま。
青色のSTART REBASEボタンを押下します。

コミットメッセージの編集

統合後、コミットメッセージを編集するダイアログが表示されます。
必要な情報を残しつつ、適切に編集しましょう。
編集が完了したらCOMMIT_EDIITMSGのタブを✕ボタンを押してタブを閉じましょう。

rebaseの確認

Gitグラフで変更を確認します。
change2のコミットIDが変わってますね。
change2~6を合体して新たなコミットが生成されています!

リモートリポジトリにpushしたコミットをどうしてもまとめたいときは

  1. 自分以外だれも該当リポジトリのローカル開発をしていないことを確認
    • 開発中の人がいるなら、その人がpushするまで待ちましょう。
  2. 最新のコミットをpull
  3. 当記事の手順でまとめたいコミットをrebase
  4. 以下の2つのオプションを追加してpush!!
    git push origin feature/sample1 --force-with-lease --force-if-includes

pushオプションの解説

  • 前提
    • push済みのコミットをrebaseにより削除するとpushできなくなる。エラーになる。
    • オプションなしでpushするとエラーになる。ローカルとリモートでコミット履歴がかわったから。
    • --forceオプションを使うと強制的にpushできるが、何も考慮せず強制上書きするので危険。
  • --force-with-lease
    • 利点
      • rebase後もpushできる
      • ただし自分がpullした後に、他の人がpushしてる状態であれば、エラーになる。
      • → 人のコミットを上書き削除しちゃうミスを防止できる!
    • 仕組み
      • ローカルの ref とリモートの ref の最終更新時間を比較
      • ローカルが最新なら push し、そうでなければが失敗する。
    • 欠点
      • 他の人のコミットが新たにpushされていても、ローカルでfetchするとエラーなくpushできてしまう。
  • force-if-includes
    • 利点
      • 上記欠点を補える。fetchにかかわらず他の人のコミットが新たにpushされていたらエラー担ってくれる。
    • 仕組み
      • reflog に remotes/origin/main (I) が含まれていることをチェック
      • 直前fetch状態なら拒否

まとめ

VSCodeとGitLensプラグインを使用することで、タイポの心配なく、直感的なGUI操作で安全にgit rebaseを行えます。 参考になれば嬉しいです!

Discussion