Edited at

初心者から一歩抜け出すためのGitの業 〜 git reflog

More than 5 years have passed since last update.

「かぁーっ、reset --hardしすぎたわー、かぁーっ」

っていう経験、誰でもあるだろう。俺もある。顔面蒼白である。きっとOMGとはこの時のために存在する言葉だったんだろう。

しかし我らがGit大先生にとってはそのコマンドすら、そのリポジトリという歴史上で語り継がれるひとつの史実でしかない。その証拠をお見せしよう。


git reflog

以下の様なログがあったとする。

2013-10-23 10:10 Tatsuro Baba       o [git-rebase] Add fuga

2013-10-23 10:09 Tatsuro Baba o Add hoge
2013-10-08 09:35 Tatsuro Baba o Add picture of '平塚の海岸線'
2013-10-08 09:34 Tatsuro Baba o Write the continuance of the diary

hogefugaという適当なコミットをしたけど、ストーリーを進めていくうちに、これらのコミットは必要なかったことに気がついた。

(ちなみにうちのチームでは(というか俺は)そういうとき、 『〜〜〜なんていらんかったんや』 と叫ぶ。関西人ではない)

で、以下のコマンドを叩く。

$ git reset HEAD~3 --hard

そして、ログを見てみよう。

2013-10-08 09:34 Tatsuro Baba       o [git-rebase] Write the continuance of the diary

2013-10-08 09:33 Tatsuro Baba o Add nikki
2013-10-08 09:31 Tatsuro Baba o Remove useless word

oh…

消しすぎた。消したかったのは2個だけだったのに、その先の平塚の海岸線(の写真)まで消してしまった。つらい。

どんなコミットだったか思い出して、泣く泣く画像を探してきてコミットし直そう…


とかする必要はなくて

そこでgit reflogですよ。

おもむろに以下の様な感じのコマンドを打ってみる。

$ git reflog

すると、

f1b9f54 HEAD@{0}: reset: moving to HEAD~3

3ebdf5a HEAD@{1}: commit: Add fuga
cf08929 HEAD@{2}: commit: Add hoge
f6dfa25 HEAD@{3}: rebase -i (finish): returning to refs/heads/git-rebase
f6dfa25 HEAD@{4}: rebase -i (pick): Add picture of '平塚の海岸線'
f1b9f54 HEAD@{5}: rebase -i (pick): Write the continuance of the diary
00ea658 HEAD@{6}: commit (amend): Add nikki
fb2a678 HEAD@{7}: commit (amend): Add nikki
80dfd45 HEAD@{8}: cherry-pick
fa33ce4 HEAD@{9}: checkout: moving from git-rebase to fa33ce487fafc3640d388e103992b57ba3de1193
ee88db4 HEAD@{10}: commit: Add picture of '平塚の海岸線'

まぁ例えばこんな感じのログが表示される。

これは何かと言うと、HEADの変遷を示している。例えば現在(HEAD@{0}のこと)では、resetが発動してHEADから3つ分のコミットが移動した、とか、3つ前の変更ではなんか色々rebaseが完了したらしい、とかが分かる。

ここからがgitのすごいところ。なんとこのログ、巻き戻すことができるのだ。

つまり、 やっちまった系のアレをごまかすことができるんだよ!!

ΩΩΩ<な、なんだってーーー!!!

というわけでやってみよう。

$ git reset HEAD@{1} --hard

HEAD is now at 3ebdf5a Add fuga

あっ、なんかキタっぽい!戻ったっぽい!俺確かに"Add fuga"ってコミットした!!

3ebdf5a Add fuga

cf08929 Add hoge
f6dfa25 Add picture of '平塚の海岸線'
f1b9f54 Write the continuance of the diary
00ea658 Add nikki

コミットたち「私は帰ってきた!!!」

というわけで今度はちゃんとミスらないように気をつけてresetしよう。

$ git reset HEAD~2 --hard

HEAD is now at f6dfa25 Add picture of '平塚の海岸線'

これで元通りだ。

このコマンドも前にやったgit-rebaseとかgit-add -pとかと同じで、複数人で開発しててもうmasterに突っ込んじゃった、とかそういうときにやると、多大な迷惑をかけることになるので、気をつけて欲しい。

(この記事を読んで中身が理解できるなら言わなくてもわかると思うけど)

とりあえずこいつらを覚えておけば、gitを使った開発をする上で、致命的にやばい事態には陥らなくなるはず。。。