Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
91
Help us understand the problem. What is going on with this article?
@tbaba

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

91
Help us understand the problem. What is going on with this article?
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
tbaba
プログラマー。ウェブアプリケーションとか。 https://forkwell.com の中の人。仕事道具は VSCode と Git。Git は綺麗な歴史を作る派。
grooves
エンジニア向けサービス「Forkwell」などを開発・運営しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
91
Help us understand the problem. What is going on with this article?