我想找到一个不是 merge 提交的最后(最新)Git 提交。
(假设我们只是检查提交消息,如果它不是以 Merge
开头,那么我们假设提交不是 merge - 顺便说一句,有没有更好的方法?)
我发现这篇文章可能有用:
https://mislav.net/2010/07/git-tips/
Show the last commit which message matches a regex
$ git show :/fix
# shows the last commit which has the word "fix" in its message
$ git show :/^Merge
# shows the last merge commit
我可以混合这些态度来显示最后的 merge 提交(这很有效):
$ git show --format=%B ':/^(Merge)'
但是这里正则表达式的语法(以 :/
开头)非常晦涩,不容易找到文档,而且我不明白如何反转它。当我尝试 ?!
时出现错误:
$ git show --format=%B ':/^(?!Merge)'
fatal: Invalid search pattern: ^(?!Merge)
有人可以指导我如何使用 git show
应用否定匹配吗?
请注意,提交消息可以是多行的。
编辑:
让我们考虑一个简单的场景,其中所有 merge 都可以快进(但不是)。我希望以红色标记的提交被发现为“最新”。
像这样的脚本似乎可以解决问题,但它很冗长
#!/bin/bash
readCommitMessage () {
local commit="$1"
lastCommitMsg=$(git log -1 --pretty=%B $commit)
#echo "$lastCommitMsg"
}
commit="HEAD"
readCommitMessage
while [[ "$lastCommitMsg" == Merge* ]]; do
commit="$commit""^2"
readCommitMessage "$commit"
done
echo "$lastCommitMsg"
最佳答案
git rev-list --no-merges -n 1 HEAD
如果您想要人类可读的输出而不仅仅是 sha1,您也可以使用 log
而不是 rev-list
,这在编写脚本时可能更有用。
(如果您想要按日期获取最新信息而不是按拓扑顺序获取“a”最新信息,则可能需要使用 --date-order
。)
关于git - 如何在 Git 中查找最新的非 merge 提交消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22247035/