Gitのブランチ内で編集したファイルの一覧を取得するコマンド。
状況としては、以下を想定している。
- masterからmy_branchを派生させている
- my_branchでいろいろファイルを追加や編集してコミットしている
- 時折、my_branchに対してmasterの変更をmergeして取り込んでいる
- masterから取り込んだ内容が多すぎて、my_branchで追加編集したファイルがわからなくなっている
- 純粋にファイル一覧が欲しい
以下のコマンドでファイル一覧を取得できる。
git log master..my_branch --no-merges --name-status --oneline --pretty=format:"" | sed '/^$/d'
コマンドの内容を順に追っていくと、
- 「master..my_branch」でmy_branchだけの変更に絞る
- 「--no-merges」でマージした内容は除外する
- 「--name-status」変更ファイルを表示する(先頭にAとかMとかDとかつくやつ)
- 「--oneline」でコミット番号やコメント1行にまとめる
- 「--oneline --pretty=format:""」で、1行にまとめたコミット番号などを消す
- 消したコミット番号などは空行になってしまうので、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を実行して重複行をなくしている。
変更ファイルを一覧化したいときには参考にして欲しい。