在我们的团队中,我们对 PR 有一个要求:在合并之前需要重新调整基础,以实现“半线性历史”。我正在寻找一种自动化的方法来评估此要求(我们知道如何运行脚本作为 GitHub 检查的一部分,但我需要有关进行评估本身的 git 命令的帮助)。现在我们只需要确定是否需要变基。
我们的 PR 目标是:目标分支位于提交
D
,PR 分支位于提交 P
。
a-b-c-D
\
m-n-o-P
因此,当合并 PR 时,历史记录看起来像这样
a-b-c-D---------q-----T-----W
\ / \ / \ /
m-n-o-P r-s u-v
我们可以阻止从早于 D 的提交中分支出来的 PR(例如
a
、b
或 c
),都可以使用 GitHub 的设置(要求分支保持最新,并使用git merge-base --is-ancestor
),但有些情况无法预防。
例如,我们可以检测到:PR 从提交
C
分支出来,它是当前目标分支所在的 D
的祖先。在这种情况下,我们希望分支在 D
之上重新建立基础。
a-b-C-D
\
m-n-o-P
我正在努力检测何时涉及合并。如本例所示:目标分支 'main' 在提交
X
中,PR 分支 pr_branch
在提交 J
中(在这种情况下 main
可以快进到 J
,但是有一些提交d
、f
不属于该路径 X->z->g->J
)
(main is here)
|
a--b--c--X--z
\ \
d--f--g--J
^
(pr_branch is here)
在这种情况下,
git merge-base --is-ancestor
和 github 都没有标记这一点。检测到的合并基数为 X
(通过运行 git merge-base main pr_branch
)。
我想要检查但无法用 git 命令明确表达的是: PR 在以下情况下有效:
pr_branch
可以从 main
main..pr_branch
范围内的所有提交都是main
在此示例中,我们可以检查 1,但我不知道如何测试 #2。
运行
git rev-list main..pr_branch
会给我一个提交列表:J
、g
、f
、d
、Z
。
提交
d
和 f
应该使 PR 无法通过检查,因为它们不是 main
的后代(当前为 X
)。我可以为使用 git merge-base --is-ancestor
获得的每个提交运行 rev-list
,但我想知道是否有更好或更正确的方法来执行此操作?也许已经存在一个 git 命令而不必编写脚本?
我检查了一些其他问题,例如git merge:强制执行线性历史记录和合并提交,但那里提供的脚本似乎没有检测到这种情况。
我们尝试过但没有捕获到这种情况的 GitHub 中的功能是 使您的拉取请求与基础分支保持同步
检查
main
和pr_branch
之间没有合并提交:
# the following list should be empty:
git rev-list --merges main..pr_branch