ブランチで追加・変更・削除したファイルの一覧を取得する。

Gitのブランチ内で編集したファイルの一覧を取得するコマンド。
状況としては、以下を想定している。

  1. masterからmy_branchを派生させている
  2. my_branchでいろいろファイルを追加や編集してコミットしている
  3. 時折、my_branchに対してmasterの変更をmergeして取り込んでいる
  4. masterから取り込んだ内容が多すぎて、my_branchで追加編集したファイルがわからなくなっている
  5. 純粋にファイル一覧が欲しい

以下のコマンドでファイル一覧を取得できる。

git log master..my_branch --no-merges --name-status --oneline --pretty=format:"" | sed '/^$/d'

コマンドの内容を順に追っていくと、

  1. 「master..my_branch」でmy_branchだけの変更に絞る
  2. 「--no-merges」でマージした内容は除外する
  3. 「--name-status」変更ファイルを表示する(先頭にAとかMとかDとかつくやつ)
  4. 「--oneline」でコミット番号やコメント1行にまとめる
  5. 「--oneline --pretty=format:""」で、1行にまとめたコミット番号などを消す
  6. 消したコミット番号などは空行になってしまうので、sedで空行を削除する

ということをしている。
ただこれだけだと同じファイルを何度もコミットしていた場合、そのファイルは複数表示されてしまう。なので以下のコマンドにして重複行をなくす。

git log master..my_branch --no-merges --name-status --oneline --pretty=format:"" | sed '/^$/d' | grep -v -e '^D' | awk '{print $2}' | sort | uniq
  # grepで削除ファイルを除外しているのは、自分的に削除ファイルが不要だったから
  # 削除ファイルも一覧にしたい場合は、grep部分を削除する

AやMなどを除外したあとに、sortとuniqを実行して重複行をなくしている。
変更ファイルを一覧化したいときには参考にして欲しい。