如何找到修改文件的最新git commit?


180

我想找到修改源文件的最新提交。

我可以git blame用来查看每一行的所有提交日期,但是很难确切地知道哪个提交是最后一次触摸文件。

如何在git存储库中找到接触给定文件的最后一次提交?

Answers:


230

git log 支持查看特定文件(和目录)的历史记录,因此您可以这样称呼它:

git log my/file.c

如果您确实只想列出一个最近的提交,例如要在脚本中使用它,请使用以下-n 1选项:

git log -n 1 --pretty=format:%H -- my/file.c

--pretty=format:%h告诉git log仅显示提交哈希。在--分体从得到解释为提交的名称停止文件名,以防万一它是不明确的。


12
如果您想知道文件的最后修改时间,无论分支是什么,都可以通过添加--all选项来考虑所有分支。
KC 2015年

44

如果您只想查找最新的提交,则不需要git-log,而是想要git-rev-list,它在提交路径中列出了更改该文件的提交对象,从最近的提交开始(按时间顺序)。简单的说:

git rev-list -1 <commit> <filename>

对于git-rev-list您的情况,您只需提供:

  • 要包含的提交数,或者 对于最近 -1
  • HEAD开始回溯的分支(或提交ID)如果已经在它上面,或者--all(如果要所有已知的提交),然后
  • 文件的相对路径。

这只是返回当前分支中的最新提交ID来更改该文件,例如: 215095e2e338525be0baeeebdf66bfbb304e7270

对于更复杂的示例,您可以使用标记名称,甚至是远程引用,并在通配符中包含相对路径名称,例如:

git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt

...哪个会告诉您该分支历史上通配符匹配的最新变化。rev-list的选项非常极端,它是最重要的管道命令之一,因此您可以按照可以想象的任何条件来包括或排除。

当然,请参考git-rev-list(1)手册页


您真的没有解释为什么使用效果git-log不佳。
Piotr Dobrogost

7
我不会说劣等,只是默认情况下它提供了无关的信息。git-rev-list只是返回提交ID,如果要将响应反馈到脚本或其他自动化过程中,这就是您想要的。git-log返回有关选定提交的信息,首先使用git-rev-list收集提交ID,然后收集有关每个提交的信息。如果您只是要过滤出提交信息并使用ID,则可以首先使用git-rev-list。由于log基于rev-list,因此它采用大多数相同的过滤器参数。
Michael Erickson

3
git-log是瓷器,git-rev-list是水管。
blitzen9872

27

如果您只想获取最新提交的哈希值以修改一组特定的文件(并且要避免awk使用),则可以使用:

git log -n 1 --pretty=format:%h -- <path>

这对于获取提交哈希值以供随后与结合使用非常有用git describe

例如(以防对任何人有用)…

我通过考虑更改任何源文件的最新提交来创建当前版本ID(假设您使用标记来标记版本mycode-1.2.1):

COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h)
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) &&
case "$VN" in
mycode-*)
    git update-index -q --refresh
    test -z "$(git diff-index --name-only HEAD *.c *.h)" ||
    VN="$VN-mod" ;;
*) VN="mycode-unknown-g$VN" ;;
esac
then
    continue
else
VN="mycode-unknown"
fi

这将产生如下ID:

  • mycode-1.2.1 -当源文件的当前状态对应于标记版本时
  • mycode-1.2.1-g3k7s2 -当源文件的当前状态对应于遵循标记版本的提交时
  • mycode-1.2.1-g3k7s2-mod -自从标记版本后的最后一次提交以来修改了源文件的当前状态
  • mycode-unknown -尚未创建版本标签时

5
$VN看起来像某种噩梦般的亡灵SVN
ThorSummoner

10

我不确定这是否是您想要的,但是如果您执行a git log <thefile>来获取更改该文件的提交,则不确定。您可以选择最上面的一个。它应该是您要寻找的那个。


4
如果您使用git log -n1 -- <thefile>(或通过管道将输出发送到head -1您想浪费的资源),则不必手动选择顶行(请参阅Jo Liss的答案
Tobias Kienzler 2011年

4
好点子。我想您也可以跳过-n-1直接使用。
Noufal Ibrahim 2011年

3

要将参考仅放在一行上,请尝试:

git log -n1 --oneline <path> | awk '{print $1;}'

2

一旦有了要使用的提交的SHA ID git log FILENAME,您就应该能够git show SHA_ID_HERE查看对特定提交所做的工作。您甚至不需要输入完整的ID。前6个字符应该足够。


4
这比OP要求的要多,但是仅供参考,您可以将其组合为git show $(git log -1 --pretty="%H" -- FILENAME)
单线
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.