【gitコマンド】綺麗なコミットの保ち方【git rebase -i】
はじめに
オリジナルアプリを開発するうえで私が鬼リピ(死語)しているgitコマンドを備忘を兼ねて学習アウトプットとして記すものです。
Git/GitHub に触れ始めた当初、汚くなるコミット履歴をなんとかしたいと思うことが多く、最近になってようやく git rebase -i コマンドの便利さを少し理解し、コードを修正するたびに使い倒しています。
git rebase -i コマンドにおける私がよく使うオプション類をケーススタディ形式でできるだけ解像度高く紹介したいと思います。
コミット履歴を綺麗に保ちたいけどようわからん!という方の参考になると嬉しいです。
参考記事:
ローカルリポジトリ、リモートリポジトリの履歴(歴史)を修正できる
CASE:コミットの順番を変更したい
手順
コミット1を最新のコミット(最上部)にしたいとします。

- 3つ前のコミット=「
コミット1」まで遡る(HEAD~3)
git rebase -i HEAD~3
あとは入れ替えたい順番に入れ替えるだけです。
(ターミナル上は表示が昇順:一番下が最新コミット)
Vimキー[1]で操作する必要があるためキーボードの「i」を押してinsertモードにしてから任意の編集をしたあとに「esc」→「wq:」を入力します。
- 対象のコミット行をコピー(例:
pick 520be1e コミット1)
- 入れ替えたい任意の位置にペーストして挿入
(insertモードにしてから行うこと)
- 「
esc」を押してinsertモードを解除し「:wq」と入力しRuturnキー押下するとターミナルに成功した旨が表示されます。
Successfully rebased and updated refs/heads/main.
結果
コミット1を最新コミットとして入れ替えることができました。

CASE:◯つ前のコミットの内容を修正したい
手順
以前コミットした内容で軽微なミスを発見し修正したいが新たにコミットを増やしたくない。。。というケースでも git rebase -i コマンドが力を発揮します。
最新コミットより3つ前の[コミット1]の修正をしたいとします。


- 3つ前のコミット=「
コミット1」まで遡る(HEAD~3)
git rebase -i HEAD~3
- 「
dw(単語削除のVimショートカットコマンド)」を入力し「pick」を削除
- 「
i」を押してinsertモードに変更し「pick→e(editでもOK)」へ書き換えます。
- 「
esc」を押してinsertモードを解除し「:wq」を入力しReturnキーを押下します。
- エディターで編集します。
- ターミナルで以下のコマンドを順番に実行すると成功した旨のメッセージが表示されます。
git add .
git rebase --continue
:wq
Successfully rebased and updated refs/heads/main.
結果
コミット1を古いコミットの順番のまま内容だけを修正することができました。

CASE:コミットを一つにまとめたい
手順
ここでは例としてコミット1とコミット4を統合したいとします。

ですがコミット2とコミット3が間に挟まっているので、コミットの順序を入れ替えたあとコミット1に対してコミット4を fixup するという操作をします。
- 4つ前のコミット=「
コミット1」まで遡る(HEAD~4)
git rebase -i HEAD~4
- コミット順を入れ替え、
コミット1に統合したいコミット4の「pick→f(fixupでもOK)」へ書き換えます。
(ターミナル上は表示が昇順なので下が最新です)

- 「
esc」を押してinsertモードを解除し「:wq」を入力しRuturnキー押下するとターミナルに成功した旨が表示されます。
Successfully rebased and updated refs/heads/main.
結果
コミット4をコミット1に統合することができました。

コミット順を元に戻したければ改めて上記を手順を繰り返します。修正内容によってはコンフリクトが生じるのでお気をつけください。
CASE:リモートリポジトリにプッシュ済みのコミット履歴を修正する
手順
これまではローカルリポジトリのコミット履歴を操作してきましたが、リモートリポジトリへプッシュ済み(公開済み)のコミット履歴も git rebase -i コマンドを用いて修正することができます。
例として リモートリポジトリへプッシュした状態のコミットの順番を変更する 操作を解説します。
基本的な操作は上記に記した手順と同様ですが、リモートリポジトリのコミット履歴を修正する場合は--forceオプションを指定してpushする手順が必要となります。
最新コミットとなっているコミット1の順番を3番目に修正します。
(画像:プッシュ済みのコミット)

- 3つ前のコミット=「
コミット2」まで遡る(HEAD~3)
git rebase -i HEAD~3
- コミット順を入れ替える(上記手順を参照してください)
- 「
esc」を押してinsertモードを解除し「:wq」を入力しRuturnキー押下するとターミナルに成功した旨が表示されるところまではローカルリポジトリ上のコミット履歴を修正する操作と一緒です。
Successfully rebased and updated refs/heads/main.
- プッシュ済みのコミットの修正が絡む場合は
--forceオプション(-fでもOK)を指定して再度pushします。
git push -f origin HEAD
結果
強制プッシュ前の状態(rebaseする前の状態)
強制プッシュ後の状態(rebaseした後の状態)
コミット番号が刷新されるため、コミット時間も更新されます。
(例:2日前にコミット・プッシュした場合でも、修正した時間に更新される)
さいごに
解説記事としては相当枝葉よりのトピックになってしまいましたが、軽微な修正だらけでコミット履歴を汚したくないという要望を解消できる記事になっていたら嬉しいです。
Discussion