git resetのundo方法

git resetを間違えて使ってしまったときのundo方法

まず説明用にリポジトリを用意します。

t$ git init
Initialized empty Git repository in /Users/nishio/gittest/pygit2/t/.git/

t$ touch a
t$ git add a
t$ git commit -m "add a"
[master (root-commit) 2b2e9a8] add a
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a

t$ touch b
t$ git add b
t$ git commit -m "add b"
[master 30955c0] add b
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 b

t$ git log --oneline
30955c0 add b
2b2e9a8 add a

はい、次に間違えてresetしちゃいます。

t$ git reset HEAD^
t$ git log --oneline
2b2e9a8 add a

ああ、なんということでしょう。bのコミットがなくなってしまいました!

gitでなんか失敗して消えてしまったとしても、見えなくなっているだけのことが多い。git logに-gオプションをつけてみよう。(--walk-reflogsの短縮バージョン)(追記 git log -g --onelineに相当することがgit reflogで出来るらしい。thanks id:gintenlabo)

t$ git log -g --oneline
2b2e9a8 HEAD@{0}: HEAD^: updating HEAD
30955c0 HEAD@{1}: commit: add b

これはHEADが今までどう変わってきたかのログだ。これを見るとbのコミットがHEAD@{1}なのがわかる。だからそこにresetしなおせばいい。

t$ git reset HEAD@{1}
t$ git log --oneline
30955c0 add b
2b2e9a8 add a
t$ git log -g --oneline
30955c0 HEAD@{0}: HEAD@{1}: updating HEAD
2b2e9a8 HEAD@{1}: HEAD^: updating HEAD
30955c0 HEAD@{2}: commit: add b

めでたしめでたし。


え、git reset --hardしちゃったって?

--hard
     Matches the working tree and index to that of the tree being switched to. Any changes to tracked files in the
     working tree since <commit> are lost.

わざわざlostするって書いてあるから、消えてしまった未コミットの修正は取り戻せないんじゃないかなぁ。