在没有合并回 master 的情况下,最后一个条目git rev-list master..feature/new-branch
将是您想要的。a..b
in a rev-list 为您提供b
's 历史中所有不在a
's 历史中的提交。但是既然你已经合并了,feature/new-branch 历史中的所有提交也都在 master 的历史中,所以我们必须聪明一点。
您链接的问题(更确切地说,这个答案)给出了一个很好的开始。诀窍是--first-parent
避免将所有合并到 master 的右侧视为 master 历史的一部分。git rev-list --first-parent master
为您提供直接提交到 master 的所有提交,并且不显示任何已合并的提交。唉,--first-parent
没有..
以我们想要的方式组合,所以我们必须制作我们自己的..
等价物,使用diff
. 我们可以diff
用来获取功能/新分支历史记录中所有提交的列表,并删除主“直接”历史记录中的所有提交。我使用反斜杠转义将一个命令拆分为多行:-
diff --new-line-format=%L --old-line-format= --unchanged-line-format= \
<(git rev-list --first-parent master) \
<(git rev-list --first-parent feature/new-branch)
diff
使它的选项只打印出第二个输入中的行,而不是第一个输入中的行,没有 + 或 - 的东西,也没有标题。我对 POSIX 不太了解,所以可能只有 GNU diff 有这些选项。同样,对于<( )
其他两行的运算符,您需要 bash 或 zsh。如果您必须使用其他外壳,您可能需要使用临时文件。
第一个输入(要忽略的行)是要掌握的“直接”历史,正如我们在上面发现的那样;第二个输入是特征/新分支的“直接”历史。该命令的输出是“直接”提交到 feature/new-branch 的所有提交,而不是“直接”提交到 master,其中“直接”表示“不通过合并”。包括在第二个输入中是必要的,以避免在分支 feature/new-branch之前--first-parent
包含合并到 master 中的任何提交,但它会产生从合并到 feature/new-branch 的任何其他分支中排除提交的副作用(如果您只想要第一次提交,这没有什么区别)。
与往常一样,输出顺序相反,因此输出的最后一行是您感兴趣的提交。
我真的很想知道你想用这些信息实现什么,因为它似乎根本不符合 Git 的世界模型。Git 用户知道并期望分支的历史记录包括来自分支祖先的历史记录,以及任何合并到其中的历史记录。