KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

インタラクティブリベースで色々やってたらわけわかんなくなった。色々やる前に戻したい!

実はなにやっても戻せるんですよね。 Gitのインタラクティブリベース(interactive rebase)は、コミット履歴を整理して、クリーンで理解しやすい履歴を作成するための必須機能です。無いと困ります。なんですけど、操作をミスると履歴が複雑になって、元の状態に戻せなくなっちゃうことがあります。そんな、インタラクティブリベースでわけわからなくなったときに、元の状態に戻す方法をこの記事で詳しく解説してみようと思います。

目次


インタラクティブリベースとは?

インタラクティブリベース(interactive rebase)は、Gitの機能の一つで、コミット履歴を編集・整理するために使用されます。これにより、不要なコミットの削除やコミットメッセージの修正、コミットの結合(squash)などが可能になります。主な目的は、履歴をより理解しやすく、管理しやすくすることですね。

インタラクティブリベースで起こる問題

ただ、インタラクティブリベースをやると、以下のような問題がおきることがあります:

  • コンフリクトの発生:複数のコミットを編集する際に、変更が競合してコンフリクトが発生。
  • 履歴の複雑化:リベース操作を繰り返すと、履歴が複雑になり、元の状態に戻すのが難しく。
  • 誤った操作:意図しないコミットの削除や編集を行ってしまうと、重要な変更がどっかいく。

なので、リベース操作を行う前に適切なバックアップを取り、慎重に操作を進めることが重要なわけです。

戻すための方法

でも、インタラクティブリベースでわけわからなくなってしまった場合、以下の方法で元の状態に戻すことが可能です:

  • git reflogを利用する:reflogは、Gitが記録しているすべてのHEADの移動履歴を表示します。これを利用して、リベース前の状態に戻すことができます。
  • 特定のコミットにリセットする:reflogで見つけたリベース前のコミットにgit resetコマンドを使って戻します。

実践的な手順

ステップ1:git reflogを確認する

まずは、現在のHEADの移動履歴を確認します:

git reflog

出力例:

abc1234 HEAD@{0}: rebase -i (finish): returning to refs/heads/feature
def5678 HEAD@{1}: rebase -i (start): checkout feature
ghi9012 HEAD@{2}: commit: Add new feature
jkl3456 HEAD@{3}: commit: Fix bug
mno6789 HEAD@{4}: checkout: moving from master to feature

ここで、HEAD@{2}がリベース前のコミットを指していることがわかります。

ステップ2:リセットコマンドで元に戻す

リベース前のコミットにリセットします。ここではHEAD@{2}に戻す例を示します:

git reset --hard HEAD@{2}

これで、リポジトリの状態がリベース前に戻り、誤って行ったリベース操作を取り消すことができます。

ステップ3:確認する

リセットが正しく行われたか確認するために、再度git reflogを実行し、HEADが正しいコミットを指しているか確認します。

git reflog

出力例:

ghi9012 HEAD@{0}: reset: moving to HEAD@{2}
def5678 HEAD@{1}: rebase -i (finish): returning to refs/heads/feature
def5678 HEAD@{2}: rebase -i (start): checkout feature
ghi9012 HEAD@{3}: commit: Add new feature
jkl3456 HEAD@{4}: commit: Fix bug
mno6789 HEAD@{5}: checkout: moving from master to feature

HEADがリベース前のコミットに正しく戻っていることが確認できます。

注意点とベストプラクティス

インタラクティブリベースを安全に使いこなすために、以下のポイントに注意しましょう:

  • バックアップを取る:リベース操作を行う前に、現在のブランチを別名でバックアップしておく(絶対やっといたほうがいいです)
  • 公開ブランチでのリベースは避ける:他の開発者と共有しているブランチではリベースを避け、マージを使用する
  • 頻繁にコミットする:小さな単位でコミットすることで、リベース時のコンフリクトを減らす
  • リベースの操作を理解する:リベースの各オプションや操作がどう履歴に影響するかを事前に理解しておく必要があります。

このへんを守っとくと、インタラクティブリベースをより安全かつ効果的に活用できます。

まとめ

インタラクティブリベースは、コミット履歴を整理するための強力なツール。だけど操作を誤ると履歴が複雑になり、元に戻すのが難しくなる。インタラクティブリベースでわけわからなくなった場合は、git refloggit resetを使って元の状態に戻そう!


参考資料