获取自分支分离以来的提交日志,包括父分支最新的提交。

3
我试图制作一个快速的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"
}

这段代码正确获取父提交之后的每个提交。我曾经尝试在 "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)"
1个回答

2
你需要的是^@,它是gitrevisions语法中“提交的所有父节点”的表示方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接