拉取请求与合并请求

Posted

技术标签:

【中文标题】拉取请求与合并请求【英文标题】:Pull request vs Merge request 【发布时间】:2014-04-07 14:38:31 【问题描述】:

Pull 请求和 Merge 请求有什么区别?

在 GitHub 中,它是一个拉取请求,而在 GitLab 中,它是一个合并请求。那么,这两者有区别吗?

【问题讨论】:

【参考方案1】: 推荐的答案 GitLab

GitLab 的 "merge request" 功能等同于 GitHub 的 "pull request" 功能。两者都是从另一个分支中提取更改或将更改分支到您的分支并将更改与现有代码合并的方法。它们是代码审查和变更管理的有用工具。

article from GitLab 讨论了命名功能的差异:

在 git 管理应用程序中创建合并或拉取请求,并要求指定人员合并两个分支。 GitHub 和 Bitbucket 等工具选择名称拉取请求,因为第一个手动操作是拉取功能分支。 GitLab 和 Gitorious 等工具选择名称合并请求,因为这是请求受让人的最终操作。在本文中,我们将它们称为合并请求。

“合并请求”不应与git merge 命令混淆。 “拉取请求”也不应该与git pull 命令混淆。 git 命令在拉取请求和合并请求中都在幕后使用,但合并/拉取请求所指的主题比这两个命令要广泛得多。

【讨论】:

发出拉取请求时,GitHub 是否创建中间/临时分支(不可见)? 我错过了什么?拉=获取+合并。如果最后一个动作是合并,那么第一个动作必须是 fetch。 MR 是一个更好的名字。拉取请求对我来说从来没有意义,直到我读到你关于它是第一次行动的解释,而我在第一次阅读它时理解了合并请求的含义。 “你好,你能把这段代码合并到主分支吗?” vs “你好,你能把这段代码拉到不可见的分支以进行 ” - 这里有一个明显的赢家。 @Granitosaurus 同意。作为 git 的初学者,拉取请求绝对不是我所期望的。当我开始使用 Gitlab 时,合并请求立即变得有意义。 我认为“拉取请求”来自这样的角度,即您询问拥有您目标分支的人以“拉入”您对您一直在处理的分支所做的任何提交。我怀疑这些术语是否完全来自命令的名称,以及基本概念。我认为“拉动”术语更有意义,您对 git 的工作原理有更好的理解,而“合并”的想法对于没有任何 git 背景的人来说更直观。每个人至少直观地知道“合并”应该是什么意思,但拉和推是行话。【参考方案2】:

它们是相同的功能

在 git 管理应用程序中创建合并或拉取请求,并要求指定人员合并两个分支。 GitHub 和 Bitbucket 等工具选择名称拉取请求,因为第一个手动操作是拉取功能分支。 GitLab 和 Gitorious 等工具选择名称合并请求,因为这是请求受让人的最终操作。在本文中,我们将它们称为合并请求。

-- https://about.gitlab.com/2014/09/29/gitlab-flow/

【讨论】:

不应该合并是添加新功能的开发人员的责任吗?如果开发人员 A 在 feature_branch 中添加了一个特性,他应该将主分支合并到他的分支之上,解决所有冲突并在创建合并请求之前对其进行测试? 是的,但是仍然有一个快进合并,在那之后必须有人完成才能掌握代码。实际上,我认为在一个全职开发人员团队中,如果该功能的开发人员也进行合并可能是最好的,但等待有人先审查他们的 PR 可能对他们有用。 通常,代码必须在没有任何冲突的情况下合并,才能成为有效的“合并”请求。【参考方案3】:

在我看来,它们是指相同的活动,但从不同的角度来看:

考虑一下,Alice 在存储库 A 上进行了一些提交,该存储库 A 是从 Bob 的存储库 B 派生的。

当 Alice 想要将她的更改“合并”到 B 中时,她实际上希望 Bob 从 A 中“拉出”这些更改。

因此,从 Alice 的角度来看,这是一个“合并请求”,而 Bob 将其视为一个“拉取请求”。

【讨论】:

这让我想起了我做小报告让其他同事知道git是如何工作的。 完美考试【参考方案4】:

在冲突管理方面存在细微差别。如果发生冲突,Github 中的拉取请求将导致 destination 分支上的合并提交。在 Gitlab 中,当发现冲突时,所做的修改将在 source 分支的合并提交上。

见https://docs.gitlab.com/ee/user/project/merge_requests/resolve_conflicts.html

“GitLab 通过在源中创建合并提交来解决冲突 未自动合并到目标分支的分支。这 允许在更改之前审查和测试合并提交 合并,防止意外更改进入目标分支 未经审查或破坏构建。”

【讨论】:

自从我上一篇文章以来,情况发生了一些变化。我注意到使用 Github Enterprise 2.21.6(这可能在早期版本中已更改),如果发生冲突,现在的行为如下:创建合并分支提交并将源分支移动到该提交。然后,当 PR 被解决时,会创建一个合并拉取请求提交。目标分支被移动到该合并拉取请求提交。合并分支提交和合并拉取请求提交具有不同的 SHA1。但是,如果两次提交之间没有进行任何更改,它们可能不包含任何差异。 当然,我说的是 Github 中的默认行为。在合并您的拉取请求时,您还可以选择压缩生成的提交,这将产生另一种行为。【参考方案5】:

如前面的答案所述,两者的用途几乎相同。我个人喜欢 git rebase 和合并请求(如在 gitlab 中)。它减轻了审阅者/维护者的负担,确保在添加合并请求时,功能分支包括创建功能分支后在主分支上完成的所有最新提交。这是一篇非常有用的文章,详细解释了 rebase: https://git-scm.com/book/en/v2/Git-Branching-Rebasing

【讨论】:

【参考方案6】:

GitLab 12.1(2019 年 7 月)引入了不同之处:

“Merge Requests for Confidential Issues”

在讨论、规划和解决机密问题(例如安全漏洞)时,由于 Git 存储库是公开的,因此开源项目保持高效可能尤其具有挑战性。

从 12.1 开始,现在可以使用创建机密合并请求按钮在简化的工作流程中解决公共项目中的机密问题,该按钮可帮助您在项目的私有分支中创建合并请求。

参见issue 58583 中的“Confidential issues”。

GitHub 中存在类似的功能,但涉及创建一个特殊的私有分支,称为“maintainer security advisory”。


GitLab 13.5 (Oct. 2020) 将添加 reviewers,这是 already available for GitHub 之前。

【讨论】:

以上是关于拉取请求与合并请求的主要内容,如果未能解决你的问题,请参考以下文章

GitHub:重新打开合并的拉取请求

通过拉取请求撤消合并?

GitHub Actions:如何像合并一样构建拉取请求?

如何避免使用 API 延迟 github 拉取请求合并

在 Github 中合并拉取请求时触发 Jenkins 构建

还原合并的拉取请求