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

Dan*_*iel 737 git commit

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

jac*_*b1t 1008

--follow特定文件的工作

git log --follow -- filename
Run Code Online (Sandbox Code Playgroud)

与其他解决方案的区别

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

  • 请注意,`--follow`接受_path_,它可以是文件,也可以是目录.对于后者,它将以递归方式运行,并向该点下方的所有文件报告更改.(此行为未在联机帮助页中记录,可能不是永久性的.) (40认同)
  • +1` - follow`帐户重命名,因此这比`git log - path`更强大 (26认同)
  • @SaulOrtega,`git log filename`不遵循文件重命名,即它将显示有关**文件名**(非实际文件)的所有提交.如果你创建文件`X`和`Y`,都修改了,然后被删除`Y`,并更名为`X`为`Y`,然后也改变了它,你运行`git登录Y`,你会得到两个消息_old_`Y`和_new_ one.相反,使用`--follow`,当它被命名为`X`时,你会得到关于该文件的提交_and_当它被命名为`Y`时. (8认同)
  • 是什么区别和只是`git log filename?` (5认同)
  • 使用"git log --all filename"查看所有分支中的所有提交 (5认同)
  • 这是更好的,它似乎列出了所有提交中有关该文件的提交,而不仅仅是`git log <somepath>` (4认同)
  • 最后一个参数实际上并不是文件名。它应该是文件的完整路径(绝对或相对)。仅使用文件名不会返回任何内容,因为 git 找不到该文件。即 `-- src/main/java/hello.java`,而不是 `-- hello.java` (3认同)
  • 此命令(git log --follow -- filename)是否查看所有分支中的所有提交? (2认同)

Gab*_*art 120

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.
Run Code Online (Sandbox Code Playgroud)

  • 如果文件的路径已更改,则不起作用.jackrabbit的答案适用于这种情况. (11认同)

小智 53

我一直在密切关注这一点,所有这些答案似乎并没有真正向我展示所有分支机构的所有提交.

这是我通过搞乱gitk编辑视图选项而想出的.这显示了文件的所有提交,无论分支,本地,reflog和远程.

gitk --all --first-parent --remotes --reflog --author-date-order -- filename
Run Code Online (Sandbox Code Playgroud)

  • 这对于有人进行更改但却忘记了他们提交更改的位置非常适合. (10认同)
  • 很有用。还包括隐藏提交 (2认同)
  • 请注意,“--reflog”包括被重新设定/修改或以其他方式丢弃的提交。也许这应该是显而易见的,但我尝试将其与“git log”一起使用,并试图找出为什么我看到看似重复的提交! (2认同)

San*_*raj 42

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

git log -p filename
Run Code Online (Sandbox Code Playgroud)

  • 我知道这并没有完全回答这个问题,因为他想要一份提交列表,但这是黄金并进入我的档案. (7认同)
  • 如果当前签出的分支中不存在该文件,则这根本不起作用。您可以添加像“git log -p mybranch -- filename”这样的分支,或者只使用“git log --all -- filename”来查看所有分支。 (3认同)

rfu*_*duk 37

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

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

  • 甚至`-p`如果你想看到完整的差异,不仅仅是它修改了一些行. (9认同)

Eng*_*hly 19

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

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"
Run Code Online (Sandbox Code Playgroud)

查看 gif 图片git 提交特定文件


Rob*_*rto 16

正如jackrabb1t指出的那样,--follow因为它继续列出重命名/移动之外的历史,因此更加强大.因此,如果您要查找当前不在同一路径中的文件或在各种提交中重命名的文件, - follow将跟踪它.

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

git log --follow --name-status -- <path>
Run Code Online (Sandbox Code Playgroud)

但如果你想要一个更紧凑的列表,只有重要的事情:

git log --follow --name-status --format='%H' -- <path>
Run Code Online (Sandbox Code Playgroud)

甚至

git log --follow --name-only --format='%H' -- <path>
Run Code Online (Sandbox Code Playgroud)

缺点是--follow只适用于单个文件.

  • `--follow`适用于单个_path_,它可以是一个目录.如果传递了一个目录,它将以递归方式运行,并向该点下面的所有文件报告更改. (4认同)

jit*_*hit 15

或者(从Git 1.8.4开始),也可以获得改变了特定部分的所有提交文件的.您可以通过传递起始行和结束行号来获得此结果.

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

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>
Run Code Online (Sandbox Code Playgroud)

这里upperLimitstart_line_numberlowerLimitending_line_number


sno*_*lli 10

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

git log --follow -- filename
Run Code Online (Sandbox Code Playgroud)

  • 对于`git`新手:使用`git log -p --follow - filename`来显示更改.另请注意:"filename"可以是文件,目录或子模块. (3认同)

Alw*_*ner 8

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

git log --follow --all <filepath>
Run Code Online (Sandbox Code Playgroud)


Won*_*and 7

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

git log --all -- '*.wmv'
Run Code Online (Sandbox Code Playgroud)


Cub*_*bic 6

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

git log -p --full-diff [branch] -- <path>
Run Code Online (Sandbox Code Playgroud)

  • @Anentropic 方括号应该表明该参数是可选的。 (2认同)

Leb*_*nik 5

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