Works by

プログラミング等IT技術関連でメモする

【git】git reflogでgitの履歴に対する過去の操作を管理する

git reflog

git reflogは過去に更新したブランチの履歴などを参照ログとして閲覧できる機能です。
下の例では、あるリポジトリに対して淡々とコミットした履歴を一覧表示しています。

$ git reflog
# commitやresetした履歴
80634e3 HEAD@{0}: reset: moving to HEAD~
d3f2ad5 HEAD@{0}: commit: add .gitignore
80634e3 HEAD@{1}: commit: modify CDNをローカルファイル参照に置き換え
6bfe118 HEAD@{2}: commit: move qiita.jsを src/js/service/util フォルダに移動
2e08059 HEAD@{3}: commit: move html/css/jsフォルダをsrcフォルダに移動
c9d4a29 HEAD@{4}: commit: modify js/qiita.js : qiitaServiceにgetItems()を追加
...

git reflogの使い所

git reflogで出現したHEAD@{1}のようなシンボルは、リビジョンのハッシュ値のように使うことができる。 すなわち、git diffで参照ログ間の差分を見ることができたり、git resetで操作そのものの取り消しを行うことができます。

参照ログ間のgit diff

# 操作前後でのファイル差分
$ git diff HEAD@{1} HEAD@{2}

diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 5509140..0000000
--- a/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.DS_Store

参照ログの取り消しgit reset

 
# 最初の履歴
$ git log
commit 80634e31281831f83fe7cfb2c8b541718bb2ef0b
Author: hoge <hogehoge@gmail.com>
Date:   Mon Mar 5 21:58:59 2018 +0900

    modify CDNをローカルファイル参照に置き換え

...

# 操作取り消し
$ git reset HEAD@{1}
d3f2ad5 HEAD@{0}: reset: moving to HEAD@{1}
80634e3 HEAD@{1}: reset: moving to HEAD~
d3f2ad5 HEAD@{2}: commit: add .gitignore
80634e3 HEAD@{3}: commit: modify CDNをローカルファイル参照に置き換え
6bfe118 HEAD@{4}: commit: move qiita.jsを src/js/service/util フォルダに移動
2e08059 HEAD@{5}: commit: move html/css/jsフォルダをsrcフォルダに移動
...

# 履歴がもとに戻る
commit d3f2ad5e07097a2127c25502878d57a9e4ffed6d
Author: hoge <hogehoge@gmail.com>
Date:   Mon Mar 5 23:47:47 2018 +0900

    add .gitignore

commit 80634e31281831f83fe7cfb2c8b541718bb2ef0b
Author: hoge <hogehoge@gmail.com>
Date:   Mon Mar 5 21:58:59 2018 +0900

    modify CDNをローカルファイル参照に置き換え

特に後者の操作に関しては、誤ったgit reset操作の取り消しなどを修正するのに使えるのでとても便利です。