GitのCommitをまとめるgit rebaseをVSCodeでGUIで簡単に実行する
はじめに
「コードをリファクタリングしたら、たくさんコミットが溜まってしまった...」
「機能追加の途中で細かすぎるコミットをしてしまった...」
そんな経験はありませんか?
そんなときに便利なのが
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を有効化
-
shift + cmd + p
でVSCodeのコマンドパレットを開く -
rebase
と入力 -
GitLens: Enable Interactive Rebase Editor
をクリック
GitLensのGit Rebaseを起動
-
shift + cmd + p
でVSCodeのコマンドパレットを開く -
rebase
と入力 -
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したコミットをどうしてもまとめたいときは
- 自分以外だれも該当リポジトリのローカル開発をしていないことを確認
- 開発中の人がいるなら、その人がpushするまで待ちましょう。
- 最新のコミットをpull
- 当記事の手順でまとめたいコミットをrebase
- 以下の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