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

1118
有没有一种方法可以列出所有更改了特定文件的提交?

3
你是在寻找对单个分支、所有本地分支、单个远程分支或者全部的文件进行更改吗?我认为要对全部进行更改需要一个脚本。 - benhorgen
1
git log filename - william_grisaitis
17个回答

1455

--follow 可用于特定文件。

git log --follow -- filename

与其他提供的解决方案的不同之处

注意,其他解决方案包括git log path(不带--follow)。如果你想跟踪例如一个目录下的变化,这种方法非常方便,但是当文件被重命名时会出现问题,因此要使用--follow filename


5
这个更好,它似乎列出了有关文件的提交记录,跨越了所有提交,而不仅仅是 git log <somepath> - Yo Ludke
49
+1 中的 --follow 选项可以追踪文件重命名,因此它比 git log -- path 更加稳健。 - Gabe Moothart
61
注意,--follow 选项接受一个“路径”作为参数,该路径可以是文件,也可以是目录。如果是后者,则它将递归运行并报告该点以下所有文件的更改。 (此行为未在手册中记录,可能不是永久的。) - StvnW
9
@SaulOrtega,git log filename 不遵循文件重命名,即它将显示与文件名(而不是实际文件)相关的所有提交。如果您创建文件 XY,对两个文件进行更改,然后删除 Y 并将 X 重命名为 Y,然后再次进行更改,并运行 git log Y,您将会得到关于 YY 的信息。相反,使用 --follow,将获取该文件在命名为 XY 时的提交记录。 - MarSoft
13
使用命令"git log --all filename"查看所有分支中文件的所有提交记录。 - Lebnik
显示剩余13条评论

158

我一直在仔细研究这个问题,所有这些答案似乎都没有真正展示给我跨所有分支的所有提交。

通过调整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

18
适用于当某人进行更改,但忘记在哪里提交更改的情况。 - earthmeLon
4
非常有用。还包括隐藏提交。 - Juan Antonio Tubío
1
这应该是首选答案。问题是要找到所有提交,而这个答案做到了。 - carl verbiest
2
请注意,--reflog 包括被 rebase/amend 或者其他方式丢弃的提交。也许这很明显,但是我尝试在 git log 中使用它时,一直在努力弄清楚为什么会看到 seemingly duplicated commits! - Soren Bjornstad
我不明白...@gabe-moothart的被接受的答案显示了创建测试树上文件的提交的所有父提交 - 即不修改该文件的提交。尽管如此,这个答案在我的测试仓库中完美地工作。 - Ewan
显示剩余2条评论

130

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.

15
如果文件路径已更改,则此方法无效。jackrabbit的答案可以解决这个问题。 - kwahn
1
如果您需要将日志限制在特定分支上,则可以使用此方法。 - Aaron Swan

52
请使用以下命令获取特定文件的提交记录:
git log -p filename

9
我理解这并不能完全回答问题因为他想要一个提交清单,但这很有价值,我会将其保存下来。 - zkent
3
如果当前检出的分支中不存在该文件,那么这根本行不通。你可以像这样添加分支:git log -p mybranch -- filename 或者直接使用 git log --all -- filename 来查找所有分支中的文件。 - Soren Bjornstad
1
由于某些原因,上述“log --follow”解决方案给出了错误的信息(提交次数比实际多)。这个解决方案“git log -p 文件名”提供了正确的信息。 - chillpenguin

42

执行git log <somepath>即可,具体请参考手册(git-log(1))。

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


13
如果你想查看全部差异而不仅仅是有多少行被修改,甚至可以使用 -p - Cascabel
没错,但考虑到大多数文件在它们的生命周期内已经被修改了很多次,这样做会非常嘈杂。我不想看到每个曾经触及文件的提交的完整差异。通常我只是在寻找特定的东西,所以我可以获取一个仅包含影响的日志,然后对看起来重要的具体提交使用 git show 命令。 - rfunduk
git log --stat --follow -- *.html => 输出每个提交中仅有一个文件的提交列表。非常好! - Sergio Belevskij

26

另外(自Git 1.8.4以来),还可以仅获取更改了文件中特定部分的所有提交。只需传递起始行和结束行号即可。

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

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

其中upperLimitstart_line_number,而lowerLimitending_line_number

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


链接已经失效:HTTP:"techpurohit.com已过期并免费停放"。HTTPS:"连接www.techpurohit.com时发生错误。PR_END_OF_FILE_ERROR"。 - Peter Mortensen

19

正如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

18

要获取特定文件的所有提交,请使用:

git rev-list HEAD --oneline 文件名

例如:

git rev-list HEAD --oneline index.html

输出结果为:

7a2bb2f update_index_with_alias
6c03e56 update_changes
e867142 Revert "add_paragraph"

看动图特定文件的Git提交记录


14

如果你希望查看更改了特定文件的提交中的所有更改(而不仅仅是文件本身的更改),则可以传递--full-diff参数:

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

or without the [branch] - Anentropic
2
@Anentropic 方括号应该表示该参数是可选的。 - Cubic
这就是我需要的,它显示完整的更改,包括合并的一些更改。 - ThanhLD
谢谢,这需要更多的赞。git log --full-diff --stat -- <path>正是我要找的命令。 :) - Moberg

14
如果您想查找所有由文件名提交的更改,而不是文件路径,则使用以下命令:
git log --all -- '*.wmv'

没错,但这是一个通配符,它会显示与通配符匹配的所有文件,除非只有一个这样的文件。所以是的...但也不是。(它不是一个文件名,而是一个通配符。) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接