我试图制作一个快速的bash函数,返回自从当前分支分离出它的父级以来每个提交的
这段代码正确获取父提交之后的每个提交。我曾经尝试在 "git merge-base" 结果中添加 "^" 或 "~1" ,但并未成功。
--oneline
日志,包括上一个提交的行。以下是我迄今为止的内容。# stolen from another Stack Overflow question
__git__get_parent_branch() {
echo $(git show-branch 2>/dev/null |
sed "s/].*//" |
grep "\*" |
grep -v "$(git rev-parse --abbrev-ref HEAD)" |
head -n1 |
sed "s/^.*\[//" |
sed "s/[\^\~].*$//")
}
lp() {
if [[ $(git rev-parse --abbrev-ref HEAD) = master ]]; then
echo Already on master branch.
return 1
fi
local commits="$(git log --oneline $(git merge-base $(__git__get_parent_branch) HEAD)..HEAD)"
[[ -z $commits ]] && 1>&2 echo No commits since $(__git__get_parent_branch). || echo -e "$commits"
}
这段代码正确获取父提交之后的每个提交。我曾经尝试在 "git merge-base" 结果中添加 "^" 或 "~1" ,但并未成功。
local commits="$(git log --oneline $(git merge-base $(__git__get_parent_branch) HEAD)^..HEAD)"
# or
local commits="$(git log --oneline $(git merge-base $(__git__get_parent_branch) HEAD)~1..HEAD)"
然而,如果分支SHA是合并的,则此方法似乎不起作用。由于我的大多数分支都来自master
,因此这总是会发生。它不会显示合并SHA,而是显示自合并的第一个提交以来的每个条目。如果合并包含两个提交,则我会看到我想看到的行,以及我不想要的两个额外行。
我认为这个问题的关键是^
和〜1
并没有完全做我想要的事情。
(我还注意到,如果我实现这一点,我的[[ -z $commits ]]
将无法工作,但这是我可以后解决的问题)。
编辑:也许最简单的解决方案就是直接检索和附加该行。
local parent="$(__git__get_parent_branch)"
local commits="$(git log --oneline $(git merge-base $parent HEAD)..HEAD)
$(git log --oneline -1 $parent)"