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するって書いてあるから、消えてしまった未コミットの修正は取り戻せないんじゃないかなぁ。