読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET 絡みのメモを公開しています。

git reset --hardした内容を取り消す (git reset --hard, reflog, HEAD@{x}, 取り消してしまったコミットを元に戻す)

git

相変わらずGit勉強中です。
以下自分用のメモです。


特定のコミット自体をなかったことにするには

git reset --hard ...

を利用すればいいのですが、このコマンドはhardとオプションが
ついているように、コミット自体が無かったことになってしまいます。


なので、間違えて違うコミットの部分にresetしてしまうと
アワワワな事になります。(というか、なりましたw)


でも、さすがgitさん。当然元に戻す方法がありました。
reflogを使って、元に戻せます。
元に戻す場合に利用するコマンドも git reset --hard です。

git reset --hard "HEAD@{x}"

xの部分には、reflogの番号が入ります。
通常元に戻す場合は、"HEAD@{1}"になると思います。

# 試すためのブランチつくって切り替え
git checkout -b test-branch

# 適当なファイルを新規作成してコミット
git add -A
git commit -m "first commit"

# 何回分かのコミット履歴を作っておく
git commit -am "second commit"
git commit -am "third commit"

# コミットログ確認
git log --oneline -n 3
  64606a0 third commit
  6be52a3 second commit
  74f21a7 first commit

# 2番目のコミット (second commit) に戻ろうと思って、間違えて first commitまで戻ってしまった・・・
git reset --hard HEAD^^
  HEAD is now at 74f21a7 first commit
  
# ログ見ると、履歴が取り消されてる・・・
git log --oneline -n 3
  74f21a7 first commit

# reflogを確認!
git reflog -n 5
  74f21a7 HEAD@{0}: reset: moving to HEAD^^  <<--ここがさっき間違えてresetした地点
  64606a0 HEAD@{1}: commit: third commit     <<--取り消される前のコミット履歴が残っている
  6be52a3 HEAD@{2}: commit: second commit
  74f21a7 HEAD@{3}: commit: first commit
  30fa85e HEAD@{4}: checkout: moving from master to test-branch
  
# 戻すべきreflogが判明したので、再度reset --hardする
git reset --hard "HEAD@{1}"
  HEAD is now at 64606a0 third commit

# コミットログ確認
git log --oneline -n 3
  64606a0 third commit
  6be52a3 second commit
  74f21a7 first commit

#
# ちゃんと戻ってる!
#

# このブランチ、もういらないので削除
git checkout master
git branch -D test-branch

================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。