如何让'git log'显示像'svn log-v'这样的文件名

SVN的日志有一个“-v”模式,输出每次提交中更改的文件名,如下所示:

jes5199$ svn log -v------------------------------------------------------------------------r1 |   jes5199 | 2007-01-03 14:39:41 -0800 (Wed, 03 Jan 2007) | 1 lineChanged paths:A /AUTHORSA /COPYINGA /ChangeLogA /EVOLUTIONA /INSTALLA /MacOSX

有没有一种快速的方法可以在Git中的每次提交中获取更改文件的列表?

529943 次浏览

注意:git whatchanged已弃用,请使用git log代替

鼓励新用户使用git-log[1]代替。Thewhatchanged命令本质上与git-log[1]但默认显示原始格式diff输出和跳过合并。

命令主要是由于历史原因而保留的;许多人的手指早在git log通过阅读发明之前就学习Git的人Linux内核邮件列表被训练来键入它。


您可以使用命令git whatchanged --stat获取在每次提交中更改的文件列表(以及提交消息)。

参考文献

对于更改文件的完整路径名:

git log --name-only

对于更改文件的完整路径名和状态:

git log --name-status

对于缩写的路径名和更改的文件的比较:

git log --stat

还有更多的选择看看留档

git show也是一个很好的命令。

它有点像svn diff,但你可以传递一个git提交哈希并查看差异。

git diff --stat HEAD^!显示上次提交的更改文件和添加/删除的行数(HEAD)。

在我看来,没有任何单个命令可以获得仅由文件名组成的简洁输出,并且一次添加和删除多个提交的行数,所以我创建了自己的Bash脚本:

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

例如,它将被调用./changed_files 99以获得从HEADHEAD~99的简明形式的更改。它可以通过管道传输,例如,到less

如果您只想获取文件名而不需要其余的提交消息,您可以使用:

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

然后可以将其扩展为使用包含文件名的各种选项:

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

使用此方法时需要注意的一件事是输出中有一些必须忽略的空行。如果您想查看本地分支上已更改的文件,但尚未推送到远程分支,并且不能保证已经从远程拉取了最新的文件,则使用此方法会很有用。例如:

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

将显示本地分支上已更改但尚未合并到远程主分支上的所有文件。

我用这个:

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

它只输出文件列表及其状态(添加、修改、删除):

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

我每天都使用它来显示更改文件的历史记录:

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

为了保持简短,通过执行以下操作在.gitconfig中添加别名:

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

另一个有用的命令是git diff-tree <hash>,其中哈希也可以是哈希范围(用<old>..<new> 表示)。输出示例:

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

这些领域是:

源模式、目标模式、源哈希、目标哈希、状态和文件名

状态是您期望的状态:D(已删除)、一个(已添加)、M(已修改)等。有关完整描述,请参阅手册页

我通常使用这些来获取日志:

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

我发现以下是以简洁格式列出每次提交更改的文件的理想显示:

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

带有示例输出的答案摘要

这是使用具有五个简单提交的本地存储库。

‣ git log --name-onlycommit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)Author: My Name <user@email.com>Date:   Mon Oct 21 15:46:04 2019 -0700
mv file4 to file5
file5
commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328Author: 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 1b6413400b5a6a96d062a7c13109e6325e081c85Author: My Name <user@email.com>Date:   Mon Oct 21 15:34:37 2019 -0700
foobar file2, rm file3
file2file3
commit e0dd02ce23977c782987a206236da5ab784543ccAuthor: My Name <user@email.com>Date:   Mon Oct 21 15:33:05 2019 -0700
Add file4
file4
commit b58e85692f711d402bae4ca606d3d2262bb76cf1Author: My Name <user@email.com>Date:   Mon Oct 21 15:32:41 2019 -0700
Added files
file1file2file3


‣ git log --name-statuscommit 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 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328Author: 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 1b6413400b5a6a96d062a7c13109e6325e081c85Author: My Name <user@email.com>Date:   Mon Oct 21 15:34:37 2019 -0700
foobar file2, rm file3
M       file2D       file3
commit e0dd02ce23977c782987a206236da5ab784543ccAuthor: My Name <user@email.com>Date:   Mon Oct 21 15:33:05 2019 -0700
Add file4
A       file4
commit b58e85692f711d402bae4ca606d3d2262bb76cf1Author: My Name <user@email.com>Date:   Mon Oct 21 15:32:41 2019 -0700
Added files
A       file1A       file2A       file3


‣ git log --statcommit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)Author: My Name <user@email.com>Date:   Mon Oct 21 15:46:04 2019 -0700
mv file4 to file5
file4 => file5 | 01 file changed, 0 insertions(+), 0 deletions(-)
commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328Author: 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 1b6413400b5a6a96d062a7c13109e6325e081c85Author: My Name <user@email.com>Date:   Mon Oct 21 15:34:37 2019 -0700
foobar file2, rm file3
file2 | 1 +file3 | 02 files changed, 1 insertion(+)
commit e0dd02ce23977c782987a206236da5ab784543ccAuthor: My Name <user@email.com>Date:   Mon Oct 21 15:33:05 2019 -0700
Add file4
file4 | 01 file changed, 0 insertions(+), 0 deletions(-)
commit b58e85692f711d402bae4ca606d3d2262bb76cf1Author: My Name <user@email.com>Date:   Mon Oct 21 15:32:41 2019 -0700
Added files
file1 | 0file2 | 0file3 | 03 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --onelineed080bc (HEAD -> master) mv file4 to file5file55c4e8cf foo file1file11b64134 foobar file2, rm file3file2file3e0dd02c Add file4file4b58e856 Added filesfile1file2file3


‣ 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 filesA     file1A     file2A     file3


‣ git diff-tree HEADed080bc88b7bf0c5125e093a26549f3755f7ae74: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 b58e85692f711d402bae4ca606d3d2262bb76cf1Author: My Name <user@email.com>
Added files
file1 | 0file2 | 0file3 | 03 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --pretty=format:file5
file1
file2file3
file4
file1file2file3


‣ git log --name-status --pretty=format:R100    file4   file5
M       file1
M       file2D       file3
A       file4
A       file1A       file2A       file3


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


‣ git showcommit 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/file5similarity index 100%rename from file4rename to file5


作者:@CB-Bailey@Peter Suwara@Gaurav@Omer-Dagan@xsor@Hazok@nrz@ptc

这个简短的命令对于列出每次提交更改的所有文件非常有用。

git log --name-only --oneline

只有名字

仅显示更改文件的名称。文件名通常编码在UTF-8。有关更多信息,请参阅git-log1手册页。

--oneline

This is a shorthand for "--pretty=oneline --abbrev-commit" used together.

输出输出

我正在使用:

git diff-tree -v --name-status -r <commit-id>

它显示了非常相似的输出,如svn log-v