「かぁーっ、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
hoge
とfuga
という適当なコミットをしたけど、ストーリーを進めていくうちに、これらのコミットは必要なかったことに気がついた。
(ちなみにうちのチームでは(というか俺は)そういうとき、 『〜〜〜なんていらんかったんや』 と叫ぶ。関西人ではない)
で、以下のコマンドを叩く。
$ 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を使った開発をする上で、致命的にやばい事態には陥らなくなるはず。。。