2つのGitコミット間で変更されたすべてのファイルのリストを取得するにはどうすればよいですか?


178

官僚主義のため、レポート用にリポジトリ内の変更されたすべてのファイルのリストを取得する必要があります(既存のソースコードから始めました)。

このリストを取得するには何を実行すればよいですか?


34
「官僚主義による」xD
ptim 2017

回答:


238

特定のSHAと現在のコミットの間で変更されたファイルの場合:

git diff --name-only <starting SHA> HEAD

または、変更されたがまだコミットされていないファイルを含める場合:

git diff --name-only <starting SHA>

より一般的には、次の構文は、2つのコミット(SHAまたは他の名前で指定)の間に変更されたファイルを常に通知します。

git diff --name-only <commit1> <commit2>

2
あなたが特定のために変更されたファイルを知りたい場合と行うコミット:git diff --name-only <SHA> <SHA>^
thebugfinder

3
--name-status代わりにフラグを使用--name-onlyすると、ファイルのリストを取得して、AddedやModifiedなどの変更ステータスを確認できます。
Thane Plummer

@Amberがあること@Thaneプラマーのノートを言及する必要があります--name-status彼らに何が起こったのかを示して
ゾルタンスーレーパゴダ

64

最後のコミット以降に変更されたすべてのファイルの名前を見つけるには:

git diff --name-only

または(追跡されていないファイルを含む、もう少し詳しい情報):

git status

48
  • ステージングされていない追跡された変更済みファイルをすべてリストするには:

    git diff --name-only
    
  • すべてのステージングれた追跡変更ファイルをリストするには:

    git diff --name-only --staged
    
  • ステージングされたおよびステージングされていないすべての追跡された変更済みファイルをリストするには:

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • 追跡されgit statusていないすべてのファイル(によって一覧表示されているファイルなので、無視されたファイルは含まない)を一覧表示するには:

    git ls-files --other --exclude-standard
    

これをシェルスクリプトで使用していて、これらのコマンドが何かを返したかどうかをプログラムで確認したい場合は、git diff--exit-codeオプションが役立ちます。


16

多くのファイルを追加/変更/削除したとき(最後のコミット以降)、それらの変更を時系列で確認したいと思います。

そのために私は使用します:

  • ステージングされていないすべてのファイルを一覧表示するには:

    git ls-files --other --modified --exclude-standard
    
  • 各ファイルの最終更新日を取得するには:

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

けれどもruvimは示唆してコメントに

xargs -0 stat -c '%y %n' -- 
  • 古いものから新しいものに並べ替えるには:

    sort
    

エイリアスを使用すると、使いやすくなります。

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

または(ruvimのおかげで短くて効率的)

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

例えば:

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

これで、変更内容を古いものから最近のものまで確認できます。


なぜxargsシングルコールを使わないのstatですか?完全なワンライナー:git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
ruvim

@ruvimありがとうございます。非常に良い提案。見やすくするために、コメントを含めて回答を編集しました。
VonC

4

2つのコミット(追加または変更のみ)の間に内容が変更されたファイルのリストが必要なため、以下を使用しました。

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

git diffのドキュメントにあるさまざまなdiff-filterオプション:

diff-filter = [(A | C | D | M | R | T | U | X | B)…[*]]

追加された(A)、コピーされた(C)、削除された(D)、変更された(M)、名前が変更された(R)ファイルのタイプ(つまり、通常のファイル、シンボリックリンク、サブモジュールなど)が変更された(T)、統合されていない(U)、不明(X)、またはペアリングが解除されている(B)。フィルター文字の任意の組み合わせ(なしを含む)を使用できます。*(All-or-none)を組み合わせに追加すると、比較で他の基準に一致するファイルがある場合、すべてのパスが選択されます。他の基準に一致するファイルがない場合、何も選択されません。

また、これらの大文字を除外して除外することもできます。例--diff-filter = adは、追加および削除されたパスを除外します。

ステータスもリストしたい場合(例:A / M)、に変更--name-only--name-statusます。


3

ステージングされていない変更済みのリストはgit statusgrep次のようなコマンドを使用して取得できます。のようなものgit status -s | grep M

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....

これはステージングされていない変更にのみ使用できるため、「2つのGitコミット間で変更されたファイル」には役に立たないことに注意してください
John Vandenberg

2

ではgit show、あなたは同様の結果を得ることができます。git log含まれているファイルのリストを使用して(ビューに表示されるように)コミットを確認するには、次のコマンドを使用します。

git show --name-only [commit-id_A]^..[commit-id_B]

[commit-id_A]最初のコミットはどこにあり、[commit-id_B]表示したいのは最後のコミットです。

特別な注意^シンボル。これを指定しないと、commit-id_A情報はデプロイされません。


1

変更されたファイルをチェックしたい場合は、どのタイプのファイルが変更されたかをチェックしたい場合など、使用するのが最も良いような多くの小さなことに注意する必要があります。

git status-変更されたファイルが表示されます

次に、どのような変更が行われるかを知りたい場合は、次の方法で確認できます。

git diff-すべてのファイルのすべての変更を表示します

1つのファイルのみが変更されている場合にのみ有効です

特定のファイルをチェックしたい場合は、

git diff

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.