我正在尝试确定分支中的第一次提交。我读过其他各种 SO 帖子(包括用 Git 寻找分支点? https://stackoverflow.com/questions/1527234/finding-a-branch-point-with-git),但他们没有给我我想要的东西。
通过查看分支图,我可以看到可以确定分支何时与主分支分离(在包含的图像上,紫色线来自“主分支上的第二次提交”),但是我无法在文本中使用命令行工具(git log --graph
有效,但不是我想要的)。
我所追求的承诺是0124fc8
,即第一次提交到功能/新分支。
所有合并回 master 的操作均已完成--no-ff
.
我试过了git merge-base feature/new-branch master
,但这给了我0f5e36f
(--all
做同样的事情)
我也尝试过git rev-list --boundary feature/new-branch...master
,这给了我一些提交,但没有一个是我想要的。
在没有合并回 master 的情况下,最后一个条目git rev-list master..feature/new-branch
将会是您想要的。a..b
在 rev-list 中为您提供了所有提交b
不存在的历史a
的历史。但是既然你已经合并了,feature/new-branch历史记录中的所有提交也都在master的历史记录中,所以我们必须聪明一点。
您链接的问题(更确切地说,这个答案 https://stackoverflow.com/questions/1527234/finding-a-branch-point-with-git/4991675#4991675)给出了一个很好的开始。诀窍是使用--first-parent
以避免将所有合并到 master 的右侧视为 master 历史的一部分。git rev-list --first-parent master
为您提供直接提交到 master 的所有提交,并且不显示任何合并的提交。唉,--first-parent
不与..
以我们想要的方式,所以我们必须自己制作..
等价地,使用diff
。我们可以用diff
获取功能/新分支历史记录中所有提交的列表,并删除 master 的“直接”历史记录中的所有提交。我使用反斜杠转义将一个命令分成几行:-
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。如果必须使用其他 shell,则可能需要使用临时文件。
第一个输入(要忽略的行之一)是要掌握的“直接”历史记录,正如我们在上面发现的那样;第二个输入是功能/新分支的“直接”历史记录。该命令的输出是“直接”提交到 feature/new-branch 的所有提交,但不是“直接”提交到 master,其中“直接”意味着“不通过合并”。包括--first-parent
在第二个输入上是必要的,以避免包含合并到 master 中的任何提交before分支 feature/new-branch,但它会产生排除来自合并到 feature/new-branch 的任何其他分支的提交的副作用(如果您只想要第一个提交,这不会产生任何影响)。
与往常一样,输出按相反顺序排列,因此输出的最后一行是您感兴趣的提交。
我真的很想知道你想用这些信息实现什么目的,因为它似乎根本不符合 Git 的世界模型。 Git 用户知道并期望分支的历史记录包括该分支祖先的历史记录以及任何合并到该分支的历史记录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)