1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

最強の“GIT LOG” 限界までコミット表示させよう

Last updated at Posted at 2019-06-25

はじめに

git logとやってもHEADまでのチェーンしか表示されない。
しかし、実は隠されたコミットハッシュをgit logに渡すことで他のチェーンも表示させることができる。
Gitにはいわゆる「隠れログ」が存在するのだ。

  • 可能な限りたくさんのコミットハッシュをグラフ表示1させたい。
  • Gitの「隠れログ」を発掘したい。

そのようなニーズに基づいて最強のGIT LOGを作る企画が密かに動いていた。

どのような企画?

git logにコミットハッシュを渡すと隠されたログを表示することがある。
そのようなコミットハッシュを見つけてはalias log3を更新していた。

少し前までgit log --allgit refloggit fsck --unreachablegit 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に統一して欲しいものだ。

  1. git log --graphでグラフのテキスト表示。

  2. MITライセンス(Attributionのみ)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?