如何显示Git存储库子目录的Git日志历史记录(即所有相关提交)

341

假设我有一个Git仓库,看起来像这样:

foo/
  .git/
  A/
   ... big tree here
  B/
   ... big tree here

有没有办法让git log只显示一个特定目录的日志信息?例如,我想查看哪些提交只涉及foo/A 中的文件。

6个回答

372

从目录foo/中,使用

  git log -- A
你需要使用“--”来将<path>..<since>..<until> refspec分开。
# Show changes for src/nvfs
$ git log --oneline -- src/nvfs
d6f6b3b Changes for Mac OS X
803fcc3 Initial Commit

# Show all changes (one additional commit besides in src/nvfs).
$ git log --oneline
d6f6b3b Changes for Mac OS X
96cbb79 gitignore
803fcc3 Initial Commit

1
@GoZoner,有没有一种方法可以找到所有更改了特定文件夹名称的提交?该文件夹可能已经移动了位置,因此我不想去寻找它是如何移动和移动到哪里的。 - alpha_989
2
如果当前的主目录被删除了,会怎么样? - Aaron Franke
请注意,此命令将根据请求的“路径”返回预期结果。如果路径=A,则在从“foo /”运行时可以正常工作。但是,如果您在“A”内部,则可能不会产生任何结果。 - Yury Kozlov
作为一个快速阅读,git log -- A 可能显示最小的命令,即使没有阅读任何解释文本也可以立即理解,例如 git log -- folder/ - Jason Doucette

74

输入

git log .

从特定目录获取,还提供该目录中的提交记录。


6
没用,进入特定目录后执行 "git log" 命令会显示从根目录开始的所有提交记录。请帮我翻译成中文。 - AKS
2
可以运行。使用 Git Bash。 - buckley
这个是可以工作的;然而,在结合 -n <数字> 来限制日志消息数量时,应该特别小心。如果您不小心输入 "git -n 3." 而不是 "git -n 3 ."(请注意在 3 和 . 之间缺少空格),Git 将愉快地显示整个存储库的历史记录。 - Frank Schmitt

41

如果您想以图形方式查看,可以使用gitk

gitk -- foo/A

Enter image description here


29
你可以使用相应文件夹的路径名来运行git loggit log A B 日志将只显示在AB中进行的提交。我通常加上--stat,使事情看起来更美观,这有助于快速审核提交。

7

如果要跟踪文件夹的变化,包括移动操作,可以使用以下方法:

git rev-list --all --pretty=oneline -- "*/foo/subfoo/*"

这并不完美,因为它会获取其他具有相同名称的文件夹,但如果名称是唯一的,那么它似乎能正常工作。

1
如果在您当前的工作树中不存在指定路径,则这是唯一可行的解决方案。例如,如果它仅存在于一堆主题分支中。 - Dmitry Avtonomov

6
其他答案只显示已更改的文件。如果需要特定子目录中所有更改文件的完整差异,则非常有用的命令是git log -p DIR。例如:显示特定版本范围内的所有详细更改。
git log -p 8a5fb..HEAD -- A B

commit 62ad8c5d
Author: Scott Tiger
Date:   Mon Nov 27 14:25:29 2017 +0100

    My comment

...
@@ -216,6 +216,10 @@ public class MyClass {

+  Added
-  Deleted

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