git logにsvn log -vのようなファイル名を表示させる方法


987

SVNのログには、次のように、各コミットで変更されたファイルのファイル名を出力する「-v」モードがあります。

jes5199 $ svn log -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01-03 14:39:41 -0800(2007年1月3日水曜日)| 1行
変更されたパス:
   /作者
   /コピー
   / ChangeLog
   / EVOLUTION
   / INSTALL
   / MacOSX

gitの各コミットで変更されたファイルのリストを取得する簡単な方法はありますか?


15
多くの期待/希望のようなスイッチをgit logサポートしないのはなぜ-vですか?</
gripe

回答:


1528

変更されたファイルの完全パス名:

git log --name-only

変更されたファイルのフルパス名とステータスについては、次のとおりです。

git log --name-status

省略されたパス名と変更されたファイルのdiffstatの場合:

git log --stat

さらに多くのオプションがあります。ドキュメントをチェックしてください


17
使用しますgit log --numstatgit help logその他のオプションについては、を参照してください。
ma11hew28

29
git log --name-only --onelineかなり洗練されています-コミット用に1つの色付きの行、および行ごとに1つのファイル。stackoverflow.com/a/14227496/1995714
cp.engr

4
git 2.7.3 git log --name-status --find-renamesでは、追加+削除ではなく、名前を変更したファイルを表示するために使用する必要がありました。
スザンヌデュペロン16

1
--stat長いパスは省略されることに注意してください。幅は構成可能ですが、ラップされたヒストグラムは読みにくくなっています。のような他のフォーマットは--numstat常にフルパスを印刷します。
Beni Cherniavsky-Paskin

@ ma11hew28ありがとう。--numstatgit 2.22.00以降、そのマニュアルページの946行目にあります。これは、ほとんどの人が必要とするよりもはるかに多くのオプションです。
モニカの復活-M.シュレーダー

139

注:廃止予定です。代わりに使用してください git whatchangedgit log

新しいユーザーは代わりにgit-log [1]を使用することをお勧めします 。この whatchangedコマンドは基本的にgit-log [1]と同じ ですが、デフォルトではraw形式のdiff出力が表示され、マージはスキップされます。

コマンドは主に歴史的な理由で保持されます。git logLinuxカーネルメーリングリストを読んで発明されたずっと前にGitを学んだ多くの人の指は、Git を入力するように訓練されています。


コマンドgit whatchanged --statを使用して、各コミットで変更されたファイルのリストを(コミットメッセージとともに)取得できます。

参考文献


50

git show また、素晴らしいコマンドです。

これは一種のsvn diffですが、コミットGUIDを渡してその差分を確認できます。


46

残りのコミットメッセージを除いてファイル名のみを取得する場合は、次のコマンドを使用できます。

git log --name-only --pretty=format: <branch name>

これを拡張して、ファイル名を含むさまざまなオプションを使用できます。

git log --name-status --pretty=format: <branch name>

git log --stat --pretty=format: <branch name>

この方法を使用する際に注意すべき点の1つは、無視する必要がある出力に空白行がいくつかあることです。これを使用すると、ローカルブランチで変更されたが、まだリモートブランチにプッシュされておらず、リモートからの最新のファイルがすでにプルされている保証がない場合に便利です。たとえば、 :

git log --name-only --pretty=format: my_local_branch --not origin/master

ローカルブランチで変更されたが、リモートのマスターブランチにまだマージされていないすべてのファイルを表示します。


1
上記の例では空白に注意してください-のようなものですgit log --stat --pretty="format:" $branchName。したがって、たとえば git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD)。私がそうしている間、これが私の目的に関連して巻き込まれた正確な呪文です:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
ドリフトキャッチャー

41

私はこれを毎日使用して、変更されたファイルの履歴を表示します。

git log --stat --pretty=short --graph

短くするには、次のようにしてエイリアスを追加します.gitconfig

git config --global alias.ls 'log --stat --pretty=short --graph'

鉱山はそれに非常に近いです、git log --pretty = oneline --graph --name-status。変更されたファイルのリストを表示するだけで、より簡潔になります。
Peter

15

私はこれを使います:

git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq

これはファイルのみのリストとその状態(追加、変更、削除)を出力します:

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...

7

git diff --stat HEAD^!変更されたファイルと最後のコミット(HEAD)の追加/削除された行数を示します。

ファイル名だけで構成される簡潔な出力を取得し、一度に複数のコミットの行数を追加および削除する単一のコマンドはないように思えるため、そのための独自のbashスクリプトを作成しました。

#!/bin/bash
for ((i=0; i<=$1; i++))
do
    sha1=`git log -1 --skip=$i --pretty=format:%H`
    echo "HEAD~$i $sha1"
    git diff --stat HEAD~$(($i+1)) HEAD~$i 
done

と呼ばれる。./changed_files 99簡潔な形式の変更を取得するためHEADHEAD~99。配管できます。にless


git diff --stat HEAD..masterHEADとmasterの違いを示すために行うことはできませんか、または2012年に回答を投稿したときにこれは存在しませんでしたか?
Ferrybig 2017

1
@Ferrybig OPの質問はどの程度ある「各コミットで変更されたファイルの一覧を取得する」については、ないデフの間HEADmaster。これらは2つの異なるものです。
nrz 2017

4

以下は、コミットごとにどのファイルが変更されたかを簡潔な形式で一覧表示するための理想的な表示です。

git log --pretty=oneline --graph --name-status

3

回答の要約と出力例

これは、5つの単純なコミットを持つローカルリポジトリを使用しています。

‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

file1
file2
file3


‣ git log --name-status
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

M       file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

A       file1
A       file2
A       file3


‣ git log --stat
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

 file1 | 3 +++
 1 file changed, 3 insertions(+)

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

 file2 | 1 +
 file3 | 0
 2 files changed, 1 insertion(+)

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

 file4 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

 file1 | 0
 file2 | 0
 file3 | 0
 3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --oneline
ed080bc (HEAD -> master) mv file4 to file5
file5
5c4e8cf foo file1
file1
1b64134 foobar file2, rm file3
file2
file3
e0dd02c Add file4
file4
b58e856 Added files
file1
file2
file3


‣ git log --pretty=oneline --graph --name-status
* ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master) mv file4 to file5
| R100  file4   file5
* 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328 foo file1
| M     file1
* 1b6413400b5a6a96d062a7c13109e6325e081c85 foobar file2, rm file3
| M     file2
| D     file3
* e0dd02ce23977c782987a206236da5ab784543cc Add file4
| A     file4
* b58e85692f711d402bae4ca606d3d2262bb76cf1 Added files
  A     file1
  A     file2
  A     file3


‣ git diff-tree HEAD
ed080bc88b7bf0c5125e093a26549f3755f7ae74
:100644 000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 D  file4
:000000 100644 0000000000000000000000000000000000000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 A  file5


‣ git log --stat --pretty=short --graph
* commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
| Author: My Name <user@email.com>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <user@email.com>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <user@email.com>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <user@email.com>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <user@email.com>

      Added files

   file1 | 0
   file2 | 0
   file3 | 0
   3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --pretty=format:
file5

file1

file2
file3

file4

file1
file2
file3


‣ git log --name-status --pretty=format:
R100    file4   file5

M       file1

M       file2
D       file3

A       file4

A       file1
A       file2
A       file3


‣ git diff --stat 'HEAD^!'
 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)


‣ git show
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

diff --git a/file4 b/file5
similarity index 100%
rename from file4
rename to file5


@ CB-Bailey @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptcへのクレジット


0

別の有用なコマンドはgit diff-tree <hash>、ハッシュがハッシュ範囲(表記<old>..<new>法で示される)の場合もあります。出力例:

$ git diff-tree  HEAD
:040000 040000 8e09a be406 M myfile

フィールドは次のとおりです。

ソースモード、destモード、ソースハッシュ、destハッシュ、ステータス、ファイル名

ステータスは、D(削除済み)、A(追加済み)、M(変更済み)など、予想されるものです。詳細については、manページを参照してください。


0

私は通常、これらを使用してログを取得します。

$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"

$ git log --name-status --grep="<text from Commit message>"

1
これらのオプションについては知りませんでしたが、この投稿はログをフィルタリングすることを説明している場合に役立つでしょう。しばらくの間、著者が出力にリストされる方法を変更する方法だと思いました。
Stein
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.