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

Posted

技术标签:

【中文标题】如何列出更改特定文件的所有提交?【英文标题】:How to list all commits that changed a specific file? 【发布时间】:2011-04-11 17:06:08 【问题描述】:

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

【问题讨论】:

您是否在单个分支中寻找对文件的更改;跨所有当地分支机构;跨单个遥控器上的所有分支;或跨越这一切?我认为这一切都需要一个脚本。 【参考方案1】:

--follow 适用于特定文件

git log --follow -- filename

与给出的其他解决方案的区别

请注意,其他解决方案包括git log path(没有--follow)。如果您想跟踪例如,这种方法很方便。 目录中的更改,但重命名文件时会出错(因此使用--follow filename)。

【讨论】:

+1 --follow 考虑重命名,所以这比 git log -- path 更健壮 请注意,--follow 接受 path,它可以是文件也可以是目录。在后者的情况下,它将递归运行并报告该点以下所有文件的更改。 (此行为未记录在手册页中,可能不是永久性的。) 那个和刚才的git log filename?有什么区别 @SaulOrtega, git log filename 不跟随文件重命名,即它将显示有关该 filename 的所有提交(不是实际文件)。如果您创建文件XY,更改两者,然后删​​除Y 并将X 重命名为Y,然后也更改它,然后运行git log Y,您将收到两个Y一个。反之,使用--follow,当它被命名为X时,当它被命名为Y时,你将获得关于该文件的提交。 使用“git log --all filename”查看所有分支中的所有提交【参考方案2】:

git log path 应该做你想做的事。来自git log man page:

[--] <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.

【讨论】:

如果文件的路径已更改,则不起作用。 jackrabbit 的回答确实适用于这种情况。 如果您需要将日志限制到特定分支,则此方法有效【参考方案3】:

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

这是我通过使用 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

【讨论】:

当有人进行了更改但忘记了在何处提交更改时,这是完美的选择。 非常有用。还包括 stash 提交 这应该是首选答案。问题是要找到所有提交,这个可以。 请注意,--reflog 包括已重新定位/修改或以其他方式丢弃的提交。也许这应该很明显,但我尝试将其与 git log 一起使用,并试图弄清楚为什么我看到看似重复的提交! 我不明白。@gabe-moothart 接受的答案显示了在我的测试树上创建文件的提交的所有父提交 - 即不修改文件的提交。不过,这个答案在我的测试仓库中非常有效。【参考方案4】:

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

git log -p filename

【讨论】:

我知道这并不能完全回答这个问题,因为他想要一个提交列表,但这是黄金并且进入我的文件。 如果文件在当前签出的分支中不存在,这根本不起作用。您可以像git log -p mybranch -- filename 这样添加分支,或者只使用git log --all -- filename 来查看所有分支。【参考方案5】:

应该像git log &lt;somepath&gt;一样简单;检查手册页 (git-log(1))。

我个人喜欢使用git log --stat &lt;path&gt;,这样我可以看到每次提交对文件的影响。

【讨论】:

甚至-p,如果您想查看完整的差异,不仅仅是修改了一些行数。 是的,但考虑到大多数文件在其生命周期中已多次更改,这太吵了。我不想看到曾经触及文件的每个提交的完整差异。我通常在寻找一个特定的东西,所以我可以得到一个只有影响的日志,然后 git show 对看起来很重要的特定提交。 git log --stat --follow -- *.html => 输出提交列表,每个提交中只有一个文件。非常好!【参考方案6】:

或者(从 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

【讨论】:

链接已损坏:HTTP:“techpurohit.com 已过期,已免费停放”。 HTTPS:“连接到 www.techpurohit.com 时出错。PR_END_OF_FILE_ERROR”【参考方案7】:

作为jackrabb1t pointed out,--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 仅适用于单个文件。

【讨论】:

--follow 适用于单个 path,它可以是一个目录。如果传递一个目录,它将递归运行并报告该点以下所有文件的更改。【参考方案8】:

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

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

【讨论】:

【参考方案9】:

如果您尝试--follow 一个在之前提交中删除的文件,请使用

git log --follow -- filename

【讨论】:

对于git 新手:也使用git log -p --follow -- filename 来显示更改。另请注意:“文件名”可以是文件、目录或子模块。【参考方案10】:

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

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

【讨论】:

或没有[branch] @Anentropic 方括号应该表示该参数是可选的。 这就是我所需要的,它显示了完整的变化,包括合并后的一些变化。【参考方案11】:

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

git log --follow --all <filepath>

【讨论】:

【参考方案12】:

使用git log --all &lt;filename&gt; 查看所有分支中影响&lt;filename&gt; 的提交。

【讨论】:

【参考方案13】:

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

git rev-list HEAD --oneline FileName

例如

git rev-list HEAD --oneline index.html

输出

7a2bb2f update_index_with_alias
6c03e56 update_changes
e867142 Revert "add_paragraph"

见gif图片

【讨论】:

【参考方案14】:
gitk <path_to_filename>

假设包“gitk”已经安装。

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

sudo apt-get install gitk

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

【讨论】:

对于 Windows 用户,请注意 gitk 与 Git for Windows 捆绑在一起。【参考方案15】:

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

 git rev-list HEAD <filename>

输出:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

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

【讨论】:

【参考方案16】:
# 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>

Reference

【讨论】:

【参考方案17】:

在 Linux 上,您可以为此使用 gitk。

可以使用“sudo apt-get install git-gui gitk”安装。它可用于通过“gitk ”查看特定文件的提交。

【讨论】:

以上是关于如何列出更改特定文件的所有提交?的主要内容,如果未能解决你的问题,请参考以下文章

如何 git 还原一个特定文件的更改,而我的提交更改也涉及其他文件? [复制]

markdown 如何列出提交中的所有文件?

Git changelog:如何将所有更改都添加到特定标记?

在计算机上搜索所有未提交更改的 .git 文件夹

如何在 Visual Studio Code 中列出/搜索特定类型的所有文件

使用 git 查看对特定文件的更改