はじめに
git rebase -i は、複数のコミットをまとめたり、削除したりできる便利なコマンドですが、操作を間違えて意図しない変更をしてしまうこともあります。
そんなときでも git reflog を使えば、元の状態に戻すことが可能です。
この記事では、 git rebase -i の操作を取り消す方法を紹介します。
1. git reflog
git reflog
は、自分がgitで行った操作の履歴を確認することができます。
% git reflog
fe660f5 (HEAD -> feature, origin/feature) HEAD@{0}: rebase (finish): returning to refs/heads/feature
fe660f5 (HEAD -> feature, origin/feature) HEAD@{1}: rebase (pick): foo
fa475c1 HEAD@{2}: rebase (pick): bar
7165a76 HEAD@{3}: rebase (pick): baz
4a5d436 HEAD@{4}: rebase (pick): qux
fc15899 HEAD@{5}: rebase (pick): quux
da27275 HEAD@{6}: rebase (pick): corge
60154e8 HEAD@{7}: rebase (start): checkout HEAD~7
c84852d HEAD@{8}: checkout: moving from main to feature
下に表示されているものほど古い履歴です。
今回の例では、HEAD@{0}
からHEAD@{7}
までリベース操作が行われていて、HEAD@{8}
はmainブランチからfeatureブランチへ切り替えています。
2. git reset --hard HEAD@{n}
git reset --hard HEAD@{n}
は、自分がgitで行った操作を戻します。
n
には git reflog で確認した戻りたい履歴の番号を指定します。
先ほどの git reflog の例ならば、 git reset --hard HEAD@{8} を実行するとリベース操作前に戻るので、 git rebase -i の操作を無かったことにできます。
さいごに
私自身、 git rebase -i で「あ、しくった...」という状況に何度か陥ったことがあります。
そのたびに git reflog で履歴をさかのぼってやり直すことで助かったので、今回その方法を記事にまとめました。
なお、リモートリポジトリに既にpushしている場合は git push --force
が必要になります。
ただし、強制プッシュは他のメンバーの作業を壊す可能性があるため、慎重に使用してください。