ファイルの更新時刻とは何か?単にディレクトリツリー内のファイルの話をしているなら、そのファイルが最後に変更された時刻という定義ができる。ls -l 対象ファイル
で表示されるファイルのタイムスタンプ、いわゆるmtimeである。
一方、Gitで履歴管理されているファイルを対象とした場合、ファイルの更新時刻について、
- カレントブランチにそのファイルの内容が反映された時刻
- ファイルの内容が最後に変更された時刻
という2つの定義が存在する。*1
前者は
git log -1 --pretty=fuller --show-pulls -- 対象ファイル
で表示されるCommitDateで、カレントブランチに注目して、そのファイルの変更がカレントブランチに取り込まれたタイミングを示す。後者は
git log -1 --pretty=fuller -- 対象ファイル
で表示されるCommitDateで、ファイルの内容の変更に注目して、(カレントブランチに取り込み済みの)ファイルの変更が実際に行われたタイミングを示す。*2
一本のブランチのみで開発を行っている場合は両者は同じ時刻を示すが、ブランチとマージを使った開発をしている場合には一般にそれぞれが異なる時刻を示す。
これらはどちらも「ファイルの更新時刻」であり、「Gitで管理されたファイルの更新時刻とは何か?」という答えが一つじゃない問いを見つけて面白いなと思った。*3
このことに気づいたのは、gitの作業ツリー内のファイルのタイムスタンプを「ファイルがコミットされた時刻」に合わせてくれる2つのツール
で、ファイルの更新時刻を決めるのに git log -m –name-only するか git log –name-only するかの違いの考察から。
log に -m オプション付いてるのでマージコミットのタイムスタンプにしてるのか。なるほど、どちらも正しい。
— Yoichi Nakayama (@yoichi22) 2022年7月16日