如何列出更改了特定文件的所有提交?


799

有没有办法列出所有更改了特定文件的提交?


1
您是否正在寻找对单个分支中文件的更改;在所有当地分支机构;跨单个遥控器上的所有分支;还是全部?我认为所有这些都需要脚本。
benhorgen

Answers:


1078

--follow适用于特定文件的作品

git log --follow -- filename

与其他解决方案的区别

请注意,其他解决方案包括git log path(不包括--follow)。如果您想跟踪例如目录中的更改,则该方法很方便,但是在重命名文件(因此使用--follow filename时会遇到麻烦


32
+1 --follow代表重命名,因此比git log -- path
Gabe Moothart

42
请注意,它--follow接受path,它可以是文件,也可以是目录。对于后者,它将以递归方式运行,并报告该点以下所有文件的更改。(此行为未在手册页中进行记录,并且可能不是永久的。)
StvnW 2014年

5
那和刚才之间有什么区别git log filename?
VaTo

8
@SaulOrtega,git log filename不跟随文件重命名,即它将显示有关该文件名(不是实际文件)的所有提交。如果您创建的文件XY,都修改了,然后删除Y和重命名XY,然后也改变了它,你跑git log Y,你会得到两个消息 Y新的一个。相反,--follow当文件被命名X 命名时,您将获得与该文件有关的提交Y
MarSoft

7
使用“ git log --all filename”查看所有分支中的所有提交
Lebnik

122

git log path应该做你想做的。从git log男人

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.

11
如果文件的路径已更改,则无法使用。jackrabbit的答案确实适用于这种情况。
kwahn 2014年

1
如果您需要将日志限制为特定分支,则此方法有效
ams

63

我一直在仔细研究,所有这些答案似乎并没有真正显示出所有分支机构的所有提交。

这是我通过弄乱gitk编辑视图选项得出的。这向我显示了文件的所有提交,而与分支,本地,reflog和远程无关。

gitk --all --first-parent --remotes --reflog --author-date-order -- filename

它也适用于git log

git log --all --first-parent --remotes --reflog --author-date-order -- filename

11
当某人进行更改但忘记了更改的位置时,这是完美的选择。
EarthmeLon

2
很有用。也包括藏匿提交
胡安·安东尼奥Tubío

这应该是首选的答案。问题是要找到所有提交,而这个确实可以。
卡尔·朱比斯特,

请注意,--reflog其中包括已被重新基准化/修改或以其他方式丢弃的提交。也许这应该很明显,但是我试图将其用于git log并试图弄清为什么我看到了看似重复的提交!
索伦·比约恩斯塔德

43

使用以下命令获取特定文件的提交:

git log -p filename

8
我知道这并不能完全回答问题,因为他想要一份提交清单,但这是黄金,并且在我的文件中。
zkent

3
如果当前签出的分支中不存在该文件,则根本无法使用。您可以添加类似的分支,也可以git log -p mybranch -- filename仅使用git log --all -- filename来查看所有分支。
索伦·比约恩斯塔德

37

它应该简单git log <somepath>; 检查联机帮助页(git-log(1))。

我个人喜欢使用它,git log --stat <path>以便可以看到每次提交对文件的影响。


9
甚至即使-p您想查看完整的差异,也不仅仅是修改了一些行。
卡斯卡贝尔

的确如此,但是考虑到大多数文件在其生命周期中已多次更改,因此这很嘈杂。我不想看到曾经接触过文件的每个提交的全部差异。我通常是在寻找一个特定的东西,因此我可以得到一个仅具有影响力的日志,然后git show查看看起来很重要的特定提交。
rfunduk 2010年

git log --stat --follow-* .html =>输出提交列表,每个提交中只有一个文件。非常好!
塞尔吉奥·别列夫斯基

18

或者(自Git 1.8.4起),也可以只获取更改了文件特定部分的所有提交。您可以通过传递起始行和结束行号来实现。

返回的结果将是修改此特定部分的提交列表。命令如下:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

这里upperLimitstart_line_numberlowerLimitending_line_number

更多信息-https: //www.techpurohit.com/list-some-useful-git-commands


17

正如jackrabb1t所指出的,它--follow具有更强大的功能,因为它继续列出除重命名/移动之外的历史记录。因此,如果您正在查找当前不在同一路径中的文件,或者正在各种提交中重命名的文件,则--follow将对其进行跟踪。

如果要显示名称/路径更改,这可能是更好的选择:

git log --follow --name-status -- <path>

但是,如果您想要一个仅包含重要内容的紧凑列表:

git log --follow --name-status --format='%H' -- <path>

甚至

git log --follow --name-only --format='%H' -- <path>

缺点是--follow仅适用于单个文件。


4
--follow适用于单个路径,该路径可以是目录。如果传递了目录,它将以递归方式运行,并报告该点以下所有文件的更改。
StvnW

10

如果您尝试- 跟随先前提交中使用的文件删除

git log --follow -- filename

3
对于git新手:也git log -p --follow -- filename用于显示更改。另请注意:“文件名”可以是文件,目录或子模块。
蒂诺

8

如果要查看所有更改了文件的提交,请在所有分支中使用此命令:

git log --follow --all <filepath>

8

如果要查找filename不是的 所有提交filepath,请使用:

git log --all -- '*.wmv'

6

如果您希望查看在更改特定文件的提交中所做的所有更改(而不仅仅是对文件本身的更改),则可以传递--full-diff

git log -p --full-diff [branch] -- <path>

是否有[branch]
-Anentropic

1
@Anentropic应该使用方括号指示该参数是可选的。
立方

这就是我所需要的,它显示了完整的更改,包括合并中的某些更改。
ThanhLD

5

使用git log --all <filename>查看影响提交<filename>的所有分支。


4
gitk <path_to_filename>

假设软件包“ gitk”已经安装。

如果未安装,请执行以下操作:

sudo apt-get install gitk

然后尝试上面的命令。它适用于Linux。。。如果需要GUI,它可能对Linux用户有所帮助。


对于Windows用户,请注意,gitk它与Windows Git捆绑在一起。
Soren Bjornstad

2

要仅获取提交哈希列表,请使用 git rev-list

 git rev-list HEAD <filename>

输出:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

这意味着有5次提交已触及此文件。它是按时间倒序排列的,因此列表中的第一个提交b7c4f0d7是最新的。



1
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>

# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>

参考

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.