5

我正在尝试确定分支中的第一次提交。我已经阅读了其他各种 SO 帖子(包括Find a branch point with Git?),但它们并没有给我我想要的东西。

通过查看分支图,我可以看到可以确定分支何时与 master 分歧(在包含的图像上,紫色线来自“master 上的第二次提交”),但是我无法使用文本在文本中复制它命令行工具(git log --graph有效但不是我所追求的)。

我之后的提交是0124fc8,即第一次提交到功能/新分支。

所有返回到 master 的合并都使用--no-ff.

我试过git merge-base feature/new-branch master了,但是这给了我0f5e36f--all也一样)

我也试过git rev-list --boundary feature/new-branch...master,这给了我几个提交,但没有一个是我想要的。

显示分支图的 SourceTree

4

1 回答 1

5

在没有合并回 master 的情况下,最后一个条目git rev-list master..feature/new-branch将是您想要的。a..bin 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 用户知道并期望分支的历史记录包括来自分支祖先的历史记录,以及任何合并到其中的历史记录。

于 2012-10-19T11:49:56.863 回答