如何检测git中的分支点?

Dav*_*ave 5 git

我正在尝试确定分支中的第一个提交.我已经阅读了其他各种SO帖子(包括用Git找到一个分支点?),但是他们没有给我我想要的东西.

通过查看分支图,我可以看到有可能确定分支何时从主分支(在包含的图像上,紫色线来自"第二次提交主服务器"),但我不能在文本中使用命令行工具(git log --graph工作但不是我想要的).

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

所有合并回主人都完成了--no-ff.

我试过git merge-base feature/new-branch master,但是这给了我0f5e36f(--all做同样的)

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

SourceTree显示分支图

Dan*_*lme 5

如果没有合并回主人,最后一个条目git rev-list master..feature/new-branch将是你想要的.a..b在转录列表中为您提供b历史记录中没有的所有提交a.但是既然你已经合并了,feature/new-branch历史上的所有提交也都在master的历史中,所以我们必须更聪明一些.

你联系的问题(相反,它的答案)给了一个很好的开始.诀窍在于--first-parent避免将所有合并的右手侧视为主人历史的一部分.git rev-list --first-parent master为您提供直接提交给master的所有提交,并且不显示任何已合并的提交.唉,--first-parent并没有..按照我们想要的方式结合,所以我们必须使用我们自己的..等价物diff.我们可以使用diff我们的feature/new-branch历史记录中的所有提交列表,并删除master在"direct"历史记录中的所有提交.我使用反斜杠转义将一个命令分成几行: -

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)
Run Code Online (Sandbox Code Playgroud)

diff使它的选项只打印出第二个输入而不是第一个输入的行,没有+或 - stuff,没有标题.我对POSIX不太满意,所以可能只有GNU diff才有这些选项.同样,对于<( )其他两行的运算符,您需要bash或zsh.如果必须使用其他shell,则可能需要使用临时文件.

正如我们在上面发现的那样,第一个输入(要忽略的行之一)是要掌握的"直接"历史记录; 第二个输入是特征/新分支的"直接"历史.该命令的输出是"直接"提交给feature/new-branch的所有提交,但不是"直接"提交,其中"direct"意味着"不通过合并".包含--first-parent在第二个输入是必要的,以避免包括分支功能/新分支之前合并到主服务器的任何提交,但它将具有从合并到功能/新分支的任何其他分支中排除提交的副作用(如果你只想要第一次提交,这没有什么区别).

与往常一样,输出顺序相反,因此输出的最后一行是您感兴趣的提交.

我真的很想知道你要用这​​些信息来实现什么,因为它似乎根本不适合Git的世界模型.Git用户知道并期望分支的历史记录包括分支的祖先的历史,以及任何合并的历史.