我如何find修改文件的最近的git提交?
我想find修改源文件的最近提交。
我可以使用git blame
来查看每行提交的所有date,但很难确切地看到哪个提交是最后一个触发文件的提交。
我怎样才能find最后一个提交在我的git仓库中给定的文件?
git log
支持查看特定文件(和目录)的历史,所以你可以这样写:
git log my/file.c
如果你真的只想列出一个最近的提交,例如在脚本中使用它,你可以使用-n 1
:
git log -n 1 --pretty=format:%H -- my/file.c
--pretty=format:%h
告诉git log
只显示提交哈希(感谢TheBamf)。 --
分隔符将文件名称解释为提交名称,以防万一。
如果你只想得到最新提交的哈希来修改一组特定的文件(并且想避免awk
),你可以使用:
git log -n 1 --pretty=format:%h -- <path>
这对获取提交散列以便随后使用git describe
可能很有用。
例如(万一它对任何人有用)…
我通过考虑最新的提交来更改任何源文件来创build当前的版本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
– 当还没有创build版本标签时
如果你只是想find最近的提交,那么你不希望git-log
,你想git-rev-list
,列出提交对象改变该文件,在该提交path,从最新的一个开始按时间顺序)。 简单的说:
git rev-list -1 <commit> <filename>
对于你的情况下的git-rev-list
,你只需要提供:
- 包含的提交数量,或者仅用于最近的提交数量,
- 分支(或提交ID)开始回头看,如果你已经在头上 ,或者 – 如果你想要所有已知的提交,
- 您的文件的相对path。
这只是返回当前分支中最近的提交ID来改变该文件,例如: 215095e2e338525be0baeeebdf66bfbb304e7270
对于一个更复杂的例子,你可以使用标签名称,甚至是远程引用,并且包含相对path名和通配符,例如:
git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt
…这将告诉你最近的变化是在该分支的历史中的通配符匹配。 rev-list的选项是极端的,它是最重要的pipe道命令之一,所以你可以包括或排除任何你可以想象的标准。
当然,请参阅git-rev-list(1)手册页 。
我不知道这是否是你想要的,但如果你做一个git log <thefile>
来获取改变该文件的提交。 你可以select最上面的一个。 它应该是你正在寻找的那个。
一旦你有使用git log FILENAME
的提交的SHA ID,你应该可以做git show SHA_ID_HERE
来看看你为那个特定的提交做了什么。 你甚至不需要input整个ID; 前6个字符应该足够了。
为了只在一行上获得参考,请尝试:
git log -n1 --oneline <path> | awk '{print $1;}'