【发布时间】:2021-06-09 18:26:27
【问题描述】:
我正在尝试创建一个快速 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"
}
这会正确获取父提交之后的每个提交。我原以为我可以将^ 或~1 附加到git merge-base 结果:
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)"
【问题讨论】:
标签: git