git rebase -iではインタラクティブモードと呼ばれる方法でターミナルと対話的に操作を進めることができます。
ローカルのコミット履歴を綺麗に整理するのに役立つコマンドです。
注意
リモートに既にプッシュされているコミットに対してgit rebase -iコマンドで操作を行うのは注意が必要です。
操作を行ったローカルのコミットに対して新しいコミットハッシュが生成され、リモートとローカルの履歴が一致しなくなるためです。
他の開発者がチェックアウトしていないブランチや、チームの合意が得られている場合なら、--forceオプションを使用し強制プッシュすることによって、履歴を上書きすることができます。
直前のコミット内容の修正
直前のコミットに対して修正を行いたい場合は、git rebase -iを使用する必要はありません。
-
修正したいファイルに変更を加え、ステージングする
git add <修正したいファイル> -
--amendオプションを使用してコミットするgit commit --amend
コミット内容の修正
-
コミットログの確認
git log --oneline -
インタラクティブモードを開始
例えば、修正したいコミットが三番目だったら下記のようにする。
git rebase -i HEAD~3 -
エディタで修正したいコミットを選択
エディタが開き、下記のように表示される。
git log --onelineとは逆の順番で表示されるので注意。pick f392171 Commit message 1 pick d7322aa Commit message 2 pick c9318f4 Commit message 3修正したいコミットの
pickの文字をeditに書き換えて、保存して終了。 -
ワークツリーで変更を加える
エディタを修了させた時点で、ワークツリーは選択したコミットの状態になっています。
この状態でファイルに変更を加え、git addでステージングしましょう。 -
変更をコミットする
git commit --amend -
リベースを完了し、最新のコミットに戻ってくる
git rebase --continue
コミットメッセージのみ修正
-
コミットログの確認
git log --oneline -
インタラクティブモードを開始
例えば、修正したいコミットが三番目だったら下記のようにする。
git rebase -i HEAD~3 -
エディタで修正したいコミットを選択
エディタが開き、下記のように表示される。
git log --onelineとは逆の順番で表示されるので注意。pick f392171 Commit message 1 pick d7322aa Commit message 2 pick c9318f4 Commit message 3修正したいコミットの
pickの文字をrewordに書き換えて、保存して終了。 -
コミットメッセージを入力するエディタが開くので、新しいメッセージに書き換えて、保存して終了。
コミットの並べ替え、削除
-
コミットログの確認
git log --oneline -
インタラクティブモードを開始
例えば、修正したいコミットが三番目だったら下記のようにする。
git rebase -i HEAD~3 -
コミットの並べ替え、または削除を行う
エディタが開き、下記のように表示される。
git log --onelineとは逆の順番で表示されるので注意。pick f392171 Commit message 1 pick d7322aa Commit message 2 pick c9318f4 Commit message 3- 削除を行いたい場合は、エディタに表示されているコミットを丸ごと削除する。
- 順番を並び替えたい場合は、エディタに表示されているコミットの順番を並べ替える。
コミットをまとめる
-
コミットログの確認
git log --oneline -
インタラクティブモードを開始
例えば、修正したいコミットが三番目だったら下記のようにする。
git rebase -i HEAD~3 -
エディタで修正したいコミットを選択
エディタが開き、下記のように表示される。
git log --onelineとは逆の順番で表示されるので注意。pick f392171 Commit message 1 pick d7322aa Commit message 2 pick c9318f4 Commit message 3修正したいコミットの
pickの文字をsquashに書き換えて、保存して終了。 -
スカッシュするコミットのメッセージを編集する
再びエディタが開くので、コミットをまとめたことに対するコミットメッセージを入力する。
そのままでもよい。保存して終了。
コミットを分割する
-
コミットログの確認
git log --oneline -
インタラクティブモードを開始
例えば、修正したいコミットが三番目だったら下記のようにする。
git rebase -i HEAD~3 -
エディタで修正したいコミットを選択
エディタが開き、下記のように表示される。
git log --onelineとは逆の順番で表示されるので注意。pick f392171 Commit message 1 pick d7322aa Commit message 2 pick c9318f4 Commit message 3修正したいコミットの
pickの文字をeditに書き換えて、保存して終了。 -
選択したコミットの変更分をステージング前の状態にする
この時点では、選択したコミットの変更分はコミット済みになっているので、ステージング前の状態にする。
(git commitもgit addもされていないワークツリーの変更しかない状態に戻す。)git reset HEAd^ -
分割したいの変更分だけステージングしてコミットする
git add <分割したい変更のあるファイル> git commit -
残りの変更分をステージングしてコミットする
git add . git commit -
リベースを完了し、最新のコミットに戻ってくる
git rebase --continue
コンフリクトしたら…
git rebase —continueを行ったときにコンフリクトが起きることがあります。
コンフリクトが起きても、まずは慌てずにそのコンフリクトの解消を試みるか、git rebase -iを行う前の状態に戻すかを決めましょう。
コンフリクトを解消する場合
-
コンフリクトの発生しているファイルを開く
-
適切に変更を加え、不要なマーカーを取り除く
<<<<<<< HEAD await deleteQA(flashcardId, qaId); ======= const { success, message } = await deleteQA(flashcardId, qaId); setIsShowing(true); setType(success ? "success" : "error"); setMessage(message); >>>>>>> c3ef6b9 (QAndAEditMenuListコンポーネントの修正) -
ステージングする
-
git rebase --continueを実行する -
再度コンフリクトが発生したら
1 ~ 4の手順を繰り返す
リベース前の状態に戻す場合
git rebase --abortを実行する