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

时间:2011-01-24 16:46:07

标签: git search

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

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

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

6 个答案:

答案 0 :(得分:181)

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

git log my/file.c

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

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

--pretty=format:%h告诉git log仅显示提交哈希。 --分隔符阻止文件名被解释为提交名称,以防它不明确。

答案 1 :(得分:30)

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

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

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

  • 要包含的提交数量,或仅包含最近的 -1
  • 开始回顾的分支(或提交ID), HEAD (如果您已经在其上)或 - 全部(如果您想要所有已知的提交),以及
  • 文件的相对路径。

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

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

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

...哪个会告诉你该分支的历史记录中最近的通配符匹配是什么。 rev-list的选项是极端的,它是最重要的管道命令之一,因此您可以包含或排除您可以想象的任何标准。

当然,请参阅git-rev-list(1) Manual Page

答案 2 :(得分:26)

如果您只想获取最新提交的哈希值来修改特定文件集(并希望避免使用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 - 尚未创建版本标记时

答案 3 :(得分:9)

我不确定这是否是您想要的,但如果您执行git log <thefile>来获取更改该文件的提交。你可以挑选最顶层的。它应该是你正在寻找的那个。

答案 4 :(得分:1)

获得要使用git log FILENAME查看的提交的SHA ID后,您应该能够git show SHA_ID_HERE查看您为该特定提交所做的操作。您甚至不需要输入整个ID;前6个字符应该足够了。

答案 5 :(得分:0)

只需在一行上获得参考,请尝试:

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