間違えたgit rebaseを元に戻す方法!git reflogとgit resetを使おう!

Gitを使っていると、間違えてリベース(rebase)をしてしまうことがあります。そんなときに便利なのがgit reflogコマンドとgit resetコマンドです。

この記事では、git reflogコマンドとgit resetコマンドを使って間違えてリベース(rebase)したのを元に戻す方法を解説します。

間違えたgit rebaseを元に戻す方法

間違えて以下のコマンドを実行し、mainブランチの最新状態をfeatureブランチに取り込んでしまったとします。

git rebase main

その場合には、まずgit reflogコマンドで操作履歴を確認します。

$ git reflog
97bf9cc (HEAD -> feature) HEAD@{0}: rebase (finish): returning to refs/heads/feature
97bf9cc (HEAD -> feature) HEAD@{1}: rebase (pick): [feature]C
9560fd9 HEAD@{2}: rebase (pick): [feature]B
d0bc713 (main) HEAD@{3}: rebase (start): checkout main
e291d1d HEAD@{4}: checkout: moving from main to feature // ← rebase 開始前のココ戻りたい
…

次に、操作履歴を戻すためにgit resetコマンドを使用します。git resetコマンドで戻りたい位置を「HEAD@{n}」または「コミットのハッシュ値(コミットID)」で指定します。今回は、git rebaseコマンド実行前の状態に戻したいので、HEAD@{4}に戻します。以下のコマンドを実行してください。

# HEAD@{n}でgit rebaseコマンド実行前の状態に戻す場合の構文
git reset --hard "HEAD@{n}"

# 今回、git rebaseコマンド実行前の位置はHEAD@{4}なので以下のコマンドを実行する
git reset --hard "HEAD@{4}"

引用符を使わない場合、シェルによっては {} が特殊文字として解釈され、コマンドが正しく実行されないことがあります。そのため、引用符で囲むことにより、シェルが特殊文字を解釈するのを防いでいます。

これでgit rebaseコマンド実行前の状態まで戻ることが出来ます。なお、コミットのハッシュ値(コミットID)でgit rebaseコマンド実行前の状態に戻す場合には以下のコマンドを実行します。

# コミットのハッシュ値(コミットID)でgit rebaseコマンド実行前の状態に戻す場合の構文
git reset --hard <commit-hash>

# 今回、git rebaseコマンド実行前のコミットのハッシュ値はcb0a55a4eなので以下のコマンドを実行する
git reset --hard cb0a55a4e

あわせて読みたい

git rebaseコマンドの基本的な使い方』については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

本記事のまとめ

この記事では『間違えたgit rebaseを元に戻す方法』について、以下の内容を説明しました。

  • git reflogコマンドで操作履歴を確認する
  • 操作履歴を戻すためにgit resetコマンドを使用する

お読み頂きありがとうございました。