【git reflog】ブランチの復元やリセットしたコミットを元に戻す方法

Git

resetで間違ってコミットを戻しすぎてしまったよ。

ローカルのbranchを間違って消しちゃったけど元に戻せないかな。

たまにこういったことがありますよね。

ですがが安心してください。
そんな時に使える便利な reflog コマンドがあります。

頻繁には使わないと思いますが、ぜひ知っておきたいコマンドです。
できること」を知っていれば後で調べることもできますからね。

この記事では次の3点について説明していきますので、興味がある方はぜひ読んでいってください。

  • reflogとはどのような操作なのか
  • リセットしたコミットを元に戻す
  • 削除したブランチを元に戻す
スポンサーリンク

reflogとはどのような操作なのか

git reflog とは?を簡単に説明します。

reflogとは?gitの操作履歴を見ることができます。
過去に行ったブランチの移動やコミット、プルやリセットなどの操作履歴を見ることができます。

試しに私の環境で実行してみると、このような履歴が表示されました。

$ git reflog
ed1cab2 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: pull: Fast-forward
7b52380 HEAD@{1}: checkout: moving from task/refactor to master
2d1cd08 (origin/task/refactor, task/refactor) HEAD@{2}: reset: moving to HEAD
2d1cd08 (origin/task/refactor, task/refactor) HEAD@{3}: reset: moving to HEAD
2d1cd08 (origin/task/refactor, task/refactor) HEAD@{4}: reset: moving to HEAD
2d1cd08 (origin/task/refactor, task/refactor) HEAD@{5}: reset: moving to HEAD
2d1cd08 (origin/task/refactor, task/refactor) HEAD@{6}: commit: Use databinding in activity
d852d29 HEAD@{7}: commit: Modified to use interface
1fdd517 HEAD@{8}: checkout: moving from master to task/refactor
7b52380 HEAD@{9}: pull: Fast-forward
46cf445 HEAD@{10}: checkout: moving from task/refactor to master
1fdd517 HEAD@{11}: commit: Modify local variables
b34da93 HEAD@{12}: commit: Modify component
46cf445 HEAD@{13}: checkout: moving from master to task/refactor
46cf445 HEAD@{14}: pull: Fast-forward

commitした履歴、resetした履歴、pullした履歴などが表示されていますね。

それでは、今回のような場合に使えるコマンドをシーンに応じて紹介していきます。

リセットしたコミットを元に戻す

git reset –hard HEAD^ と間違って git reset –hard HEAD^^ なんてやってしまったよ。

間違ってコミットを戻しすぎてしまったよ。

これ、まだ間に合います。
git reflog を使うことでリセットしてしまったコミットを元に戻しましょう

コミットを元に戻す際の流れ

以下の手順でコミットを元に戻します。

  1. git reflog で元に戻す対象の履歴番号をメモ
  2. git reset でコミットを元に戻す

今回のシナリオ

誤ってコミットを消してしまった時のシナリオを以下として説明していきます。

  1. working_branchブランチでコミット
  2. working_branchブランチでコミット(2つめのコミット)
  3. 誤って git reset –hard HEAD^^ を実行

では、いよいよコミットを元に戻す流れを説明していきます。

リセットしたコミットを元に戻す

まずは、 git reflog で履歴を確認します。

$ git reflog
ed1cab2 (HEAD -> working_branch, origin/master, origin/HEAD, master) HEAD@{0}: reset: moving to HEAD^^
617c754 HEAD@{1}: commit: Modify README.md
6d27530 HEAD@{2}: commit: Add base activity

HEAD@{0} が誤って git reset –hard HEAD^^ をした履歴になっています。

git reset する前のHEADを指定することで、その時点の状況に戻すことができます。
そのため、 HEAD@{1} を使って以下のコマンドを実行します。

$ git reset --hard HEAD@{1}

これで git reset –heard HEAD^^ を実行する前の状態に戻せるのです。
簡単ですね。

削除したブランチを元に戻す

まだ必要なのに間違ってローカルのブランチ消しちゃったよ…。

これも、まだ間に合います。
git reflog を使って削除したブランチを元に戻しましょう

ブランチを元に戻す際の流れ

以下の手順で削除してしまったブランチを元に戻します。

  1. git reflog で元に戻す対象の履歴番号をメモ
  2. git branch コマンドで削除したブランチを元に戻す

今回のシナリオ

誤ってブランチを消してしまった時のシナリオを以下として説明していきます。

  1. working_branchブランチでコミット
  2. masterをチェックアウト
  3. 誤ってworking_branchブランチを削除

では、いよいよ削除したブランチを元に戻す流れを説明していきます。

削除したブランチを元に戻す

まずは、 git reflog で履歴を確認します。

$ git reflog
ed1cab2 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: checkout: moving from working_branch to master
72850f3 HEAD@{1}: commit: Add base activity

HEAD@{1} にはworking_branchブランチでコミットした履歴があり、 HEAD@{0} にはmasterをチェックアウトした履歴があります。
HEAD@{0} 時点でブランチを削除してしまったので、最後にコミットした HEAD@{1} の時のworking_branchを復活させます。

そのため、 HEAD@{1} を使って以下のコマンドを実行します。

$ git branch working_branch HEAD@{1}

これでブランチを削除する前の状態に戻せるのです。
簡単ですね。

最後に

いかがでしたでしょうか。

頻繁には使わないと思いますが、いざというときに使えるのでぜひ覚えておくと良いでしょう
読むだけではなく、実際に手を動かしてみることで身についていきますので、ぜひ一度手元で動かしてみましょう。