Help us understand the problem. What is going on with this article?

初心者から一歩抜け出すための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を使った開発をする上で、致命的にやばい事態には陥らなくなるはず。。。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away