在我们的项目中,我们希望合并的功能分支在git log --graph
中可见,但仍然具有线性历史,因此在功能分支的持续时间内,主分支上没有提交。这意味着,在合并到main之前,确保一个特性分支在main上重新设置基址。
目前,我们已经给merge = merge --no-ff
取了别名,并试图记住在合并之前总是执行git rebase
,但有时我们会忘记。
一、 e.如果合并前的情况是这样的:
A--B--C--D
\
E--F
我们希望强制执行此结果(0)
A--B--C--D------m--
\ /
E--F
并阻止这种情况(1)
A--B--C--D--m--
\ /
E----F
或者这个(2)
A--B--C--D--E--F--
不幸的是,我不知道如何使用git别名来实现这一点。
git merge --no-ff
创建合并提交,但允许结果(1)git merge --ff-only
确保主分支上没有提交,但创建结果(2)git merge --ff
愉快地创建(1)或(2),但没有(0)git merge --ff-only --no-ff
的行为与--no-ff
类似
我们都需要独立于其他分支提交到主分支,因此基于限制对主分支的访问或代码审查的解决方案并没有真正的帮助。
1条答案
按热度按时间w1e3prcc1#
**命名警告:**我不建议将其称为“线性历史”,因为没有上下文几乎总是意味着根本没有合并提交。
您试图实现的通常被称为“半线性合并”或“重设基础,合并”策略。这提供了“气泡”功能,这些气泡在日志中线性显示。请注意,当功能分支只有一个提交时,有些人允许跳过合并提交,因为在功能上,结果图中没有信息丢失。你应该决定是否允许这样做。(出于一致性的考虑,我个人的偏好是不允许这样做。但这意味着我们最终会出现很多微小的一次提交+一次合并提交气泡,这并不困扰我。)
至于如何实现这一点,我不推荐您提出的别名想法。有太多的场景,您可能希望在本地回购的日常工作中快速进行合并。
相反,我首先倾向于在服务器端强制执行策略,如果这不可能,那么您可以尝试使用钩子。对于服务器端实现,here's an answer讨论了流行的工具及其与此策略相关的功能。(目前,Azure DevOps和Bitbucket都可以开箱即用地实施这一点。)如果您使用的工具没有内置支持,请考虑实现某种门控签入,在允许合并完成(或推送)之前,验证源分支是否与目标完全更新。有很多方法可以进行检查,其中一种可能是(使用Bash):
关于本声明的注意事项:
我们都需要独立于其他分支提交到主分支,因此基于限制对主分支的访问或代码审查的解决方案并没有真正的帮助。
您仍然可以强制执行Pull Request完成策略,而无需其他人批准您的代码。例如,在Azure DevOps中,您需要PR将分支合并到
main
中,然后只允许半线性合并。AzDO将自动为您重新设置基础(如果需要),然后创建合并提交,您仍然不需要涉及其他人。我很确定Bitbucket也有这种开箱即用的功能。使用GL或GH时,您需要MR/PR,但允许自行完成,并打开门控签入,只有在完全更新时才允许您完成。如果您在本地合并到
main
并直接推送远程main
,则另一种机制将使用Git hooks。也许pre-merge
或pre-push
挂钩最有效。在钩子内部,您可以查看main
的HEAD提交,并确保以下为真:1.这是一个合并提交。
1.两个父提交(
@^1
和@^2
)的合并基数等于第一个父提交的相同提交(mn8o1P)。**旁注:**将功能分支合并到共享分支时,可以强制执行此策略。但是,如果您使用的工作流具有多个共享分支,则不希望将共享分支重新定位到另一个共享分支上,因此请确保在执行这些合并时只使用普通的旧合并。