跳至主要内容

关于拉取请求合并

您可以通过保留功能分支中的所有提交、将所有提交压缩到单个提交或通过将head分支中的各个提交重新定位到base分支来合并拉取请求

合并您的提交

当您在拉取请求上单击默认的**合并拉取请求**选项时,功能分支中的所有提交都将添加到基础分支中的合并提交中。拉取请求使用--no-ff选项进行合并。

要合并拉取请求,您必须在存储库中具有写入权限

Diagram of a standard merge and commit flow, where commits from a feature branch and an additional merge commit are both added to main.

压缩并合并您的提交

当您在拉取请求上选择**压缩并合并**选项时,拉取请求的提交将被压缩为单个提交。您不会看到贡献者从主题分支中进行的所有单个提交,而是将这些提交合并到一个提交中并合并到默认分支中。使用压缩提交的拉取请求使用快进选项进行合并。

要压缩并合并拉取请求,您必须在存储库中具有写入权限,并且存储库必须允许压缩合并

Diagram of commit squashing, where multiple commits from a feature branch are combined into only one commit that is added to main.

您可以使用压缩并合并来在存储库中创建更简化的 Git 历史记录。在处理功能分支时,工作进度提交很有用,但并非一定要保留在 Git 历史记录中。如果您在合并到默认分支时将这些提交压缩到一个提交中,则可以保留原始更改并获得清晰的 Git 历史记录。

压缩合并的合并消息

当您压缩并合并时,GitHub 会生成一个默认的提交消息,您可以对其进行编辑。根据存储库的配置方式和拉取请求中提交的数量(不包括合并提交),此消息可能包含拉取请求标题、拉取请求说明或有关提交的信息。

提交数摘要说明
一个提交单个提交的提交消息标题,后跟拉取请求编号单个提交的提交消息的主体文本
多个提交拉取请求标题,后跟拉取请求编号所有压缩提交的提交消息列表(按日期排序)

拥有仓库维护者或管理员访问权限的用户可以配置其仓库的所有压缩提交的默认合并消息,以使用拉取请求标题、拉取请求标题和提交详细信息或拉取请求标题和描述。有关更多信息,请参阅“为拉取请求配置提交压缩”。

压缩和合并长期分支

如果您计划在拉取请求合并后继续处理拉取请求的头分支,我们建议您不要压缩和合并拉取请求。

创建拉取请求时,GitHub 会识别头分支和基础分支上最新的共同提交:共同祖先提交。当您压缩并合并拉取请求时,GitHub 会在基础分支上创建一个提交,其中包含自共同祖先提交以来在头分支上所做的所有更改。

由于此提交仅存在于基础分支上,而不存在于头分支上,因此这两个分支的共同祖先保持不变。如果您继续处理头分支,然后在两个分支之间创建一个新的拉取请求,则拉取请求将包含自共同祖先以来的所有提交,包括您在之前的拉取请求中压缩和合并的提交。如果没有冲突,您可以安全地合并这些提交。但是,此工作流程会增加合并冲突的可能性。如果您继续为长期运行的头分支压缩和合并拉取请求,则将不得不重复解决相同的冲突。

变基并合并您的提交

当您在拉取请求上选择“变基并合并”选项时,主题分支(或头分支)中的所有提交将单独添加到基础分支上,而不会创建合并提交。这样,变基和合并行为类似于快进合并,因为它维护了线性的项目历史记录。但是,变基通过使用新的提交重写基础分支上的提交历史记录来实现这一点。

GitHub 上的变基和合并行为与git rebase略有不同。GitHub 上的变基和合并将始终更新提交者信息并创建新的提交 SHA,而 GitHub 外部的git rebase在变基发生在祖先提交之上时不会更改提交者信息。有关git rebase的更多信息,请参阅 Git 文档中的git-rebase

要变基并合并拉取请求,您必须在仓库中拥有写入权限,并且仓库必须允许变基合并

有关git rebase的视觉表示,请参阅《Pro Git》一书中的“Git 分支 - 变基”章节

以下情况无法自动变基并合并

  • 拉取请求存在合并冲突。
  • 将基础分支中的提交变基到头分支中时遇到冲突。
  • 变基提交被认为是“不安全的”,例如,当变基可以在没有合并冲突的情况下进行,但会产生与合并不同的结果时。

如果您仍然希望变基提交但无法自动变基和合并,则必须

  • 在命令行上本地将主题分支(或头分支)变基到基础分支
  • 在命令行上解决任何合并冲突.
  • 强制推送变基后的提交到拉取请求的主题分支(或远程头分支)。

任何拥有仓库写入权限的人员都可以使用变基并合并按钮合并更改

间接合并

如果拉取请求的头分支直接或间接合并到基础分支外部,则可以自动合并该拉取请求。换句话说,如果头分支的顶端提交可以从目标分支的顶端访问。例如

  • 分支main位于提交C处。
  • 分支feature已从main分支出来,目前位于提交D处。此分支有一个针对main的拉取请求。
  • 分支feature_2已从feature分支出来,目前位于提交E处。此分支也对main有一个拉取请求。

如果拉取请求E --> main首先合并,则拉取请求D --> main自动标记为已合并,因为feature中的所有提交现在都可以从main访问。将feature_2合并到main并将main从命令行推送到服务器将两个拉取请求都标记为已合并。

间接合并仅在以下情况下才能发生:将拉取请求的头分支中的提交直接推送到仓库的默认分支,或者拉取请求的头分支中的提交存在于另一个拉取请求中,并使用“创建合并提交”选项合并到仓库的默认分支中。

如果包含另一个拉取请求头分支中提交的拉取请求使用“压缩并合并”或“变基并合并”选项合并,则会在基础分支上创建一个新的提交,并且另一个拉取请求将不会自动合并。

即使分支保护规则未得到满足,间接合并的拉取请求也会标记为merged

进一步阅读