no7.space
💻

Git で特定の期間に変更のあったファイルのリストを抽出する

プロジェクトは Git で管理してるのに、何故か本番環境に Git がなかったりして、差分のあるファイルだけを SCP とかでアップロードしないといけないとか、
納品時に、差分のあるファイルを教えてほしいって言われたとか、

そんなときに使えるかもしれない小ネタです。

やり方

たとえば、先月(2026年1月)に作業したファイルの一覧がほしいよって場合はこうします

git log --since="2026-01-01" --until="2026-01-31" --diff-filter=AM --name-only --pretty=format:"" | sort | uniq
  • --since / --until
    • ログを取得する期間を指定します
    • 日付を指定する以外に、1 month ago みたいな感じで相対的な指定も可能です
    • 厳密にやるのであれば、 until 側は時間まで明示的に書く --until=2026-01-31 23:59:59 と確実
      • でも大抵の場合、「現時点までの差分」を提出直前にまとめることが多いと思うので、実務だとむしろ until なしでも割となんとかなることも多いかも
      • ただし月ごとに報告が必要で、翌月のコミットが既にある場合なんかはちゃんと until 書かないと巻き込まれるのでちゃんと書くクセを付けておくと間違いなさそうです。めんどうならスクリプト作ってサブコマンド化を検討しても良いかもしれません。
  • --diff-filter=AM
    • 追加と変更に限定
  • --name-only
    • コミット情報に続いて、変更のあったファイル名を表示します
  • --pretty=format:""
    • pretty はコミットに関する情報(著者、日付、メッセージなど)を自由なフォーマットで出力させるオプションですが、フォーマットに何も指定しない(空文字を指定)すれば何も表示しなくなります

特に不要ならばマージコミットを除外する --no-merges をつけても良いですが、コンフリクト解消などでマージコミット内にしか無い修正等があるときに漏らす恐れがあるので基本的にはつけないほうが良さそうです

この状態で、コミットログから変更のあったファイルの名前がだーっと流れてくるようになるので、更にパイプで sortuniq を通して、並び替えたうえで重複を無視させることで、
変更のあったファイルの一覧が作れます

--name-only って名前だけにするって意味じゃないの?

似たようなものに、 --name-status という、ファイル名と、それを「追加」「変更」「削除」のどれを行ったのかといった情報を出すオプションあり、
それに対しての名前のみ、って意味っぽいです。

そのため、オプションの見た目に反して、名前だけじゃなくて、コミット情報もしっかりと出てきます。
なので、コミット情報は pretty で何も出さないというフォーマットを指定して隠す必要があったのです。

参考