はじめに
git log
とやってもHEADまでのチェーンしか表示されない。
しかし、実は隠されたコミットハッシュをgit log
に渡すことで他のチェーンも表示させることができる。
Gitにはいわゆる「隠れログ」が存在するのだ。
- 可能な限りたくさんのコミットハッシュをグラフ表示1させたい。
- Gitの「隠れログ」を発掘したい。
そのようなニーズに基づいて最強のGIT LOGを作る企画が密かに動いていた。
どのような企画?
git log
にコミットハッシュを渡すと隠されたログを表示することがある。
そのようなコミットハッシュを見つけてはalias log3を更新していた。
少し前までgit log --all
やgit reflog
やgit fsck --unreachable
やgit rev-list --all
を使ったalias log3が最強のGIT LOGだった。
しかし、このたび新たなコミットハッシュが見つかり更新した。
現時点で最強のGIT LOGということだ。
最強のGIT LOG2
alias log3='git fsck --verbose 2>&1 | perl -nle '\''foreach(split /\s|->/){$commit{$_}=1 if length==40 && $_ ne "0000000000000000000000000000000000000000" && ! /dangling$/};END{print join " ",keys %commit}'\'' | xargs git log2'
git log2は色付きワンラインでlog --graphを表示させるgit configのalias。
xargs git logに色付きのコミットハッシュを渡すと動かないので要注意。
どのような動作をするか?
git fsck --verbose
とやると隠されたコミットハッシュをたくさん表示する。
空白で区切るなどして40文字のコミットハッシュを限界まで抽出しgit log2に渡す。
こうすることでGitに隠されたコミットハッシュを発掘できる。
どこがいいか?
Gitは基本的にすべての変更をログに残している。
初心者が「変更が消えてしまった」とパニックになったとき実は変更が残っていたことがよくある。
たとえばファイルを編集してgit add
したあとでgit checkout -f
すると変更が消えてしまっている。
Gitは基本的にすべての変更をログを残しているので戻せるに違いない。
変更が残っているか最強のGIT LOGで調べられる。
$ log3
* c3a8ddc [2019-06-26] (HEAD -> master) 変更2 @Query Kuma
* 288f431 [2019-06-26] 変更1 @Query Kuma
* 4ea8d30 [2019-06-26] 初期化 @Query Kuma
しかし、調べてもどこにもコミットハッシュが出てこない。
残念ながらGitに変更ログが残らない稀有な例のようだ。
Gitに変更を残すにはgit commit
しなければならないことがわかる。
10分おきにgit commit
すると安心だ。
次はファイルを編集したあとでgit stash
してgit stash clear
した場合はどうだろうか。
ファイルの変更が消えてしまっている。
git stash list
とやっても表示されずパニックになる。
でも最強のGIT LOGで調べれば安心だ。
$ log3
* 4364184 [2019-06-25] WIP on master: 7cc979e 変更2 @Query Kuma
|\
| * a6c6819 [2019-06-25] index on master: 7cc979e 変更2 @Query Kuma
|/
* 7cc979e [2019-06-25] (HEAD -> master) 変更2 @Query Kuma
* b9f63a5 [2019-06-25] 変更1 @Query Kuma
* f68b150 [2019-06-25] 初期化 @Query Kuma
stashのコミットハッシュ4364184からファイルの変更を取り戻せる。
最強のGIT LOGで見る限りstashは通常のコミットと変わらないようだ。
HEADからstashのコミットハッシュまで線でつながっている。
つまりgit commit
していればよく、git stash
を使おうと思ったことがない。
stashの使い方を忘れた頃にgit stash clear
とやってパニックになる。
初心者が誤りやすいstashを削除してcommitに統一して欲しいものだ。