我正在尝试创建一个快速的 bash 函数,该函数返回--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"
}
这可以正确获取每个提交after父母的承诺。我原以为我可以附加^
or ~1
to the git merge-base
result:
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,而是显示自该合并第一次提交以来的每个条目。如果合并包含两个提交,我会看到我想要看到的行,以及另外两个我不想要的行。
我认为这个问题的关键在于^
and ~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)"