在Github中将拉取请求合并到与默认分支不同的分支

173

有一个拉取请求进入我的托管在Github上的repo。默认情况下,它会合并到 master 分支中。

是否有任何方法让我更改将更改合并到哪个分支中?


据我所知,在GitHub上没有办法更改不同分支合并的默认分支,因为GitHub只有一个“基础”分支的概念,它用于所有操作。每次都需要手动更改。 - undefined
6个回答

149

截至2016年8月15日,GitHub允许通过GUI更改拉取请求的目标分支。单击标题旁边的编辑,然后从下拉菜单中选择分支。

screenshot

现在,您可以更改打开的拉取请求的基本分支。创建拉取请求后,您可以修改基本分支,以便将拉取请求中的更改与不同分支进行比较。通过更改原始拉取请求的基本分支而不是使用正确的基本分支打开新的拉取请求,您将能够保留有价值的工作和讨论。

这个功能似乎已经不存在了(截至2018-02-15),是吗?在最近的拉取请求中,目标分支以与源存储库/分支相同的蓝色字体显示在浅蓝色背景上,而不再是按钮。 - cgogolin
19
啊!没错!首先需要点击“编辑”(从上面的截图中不太明显)。我之前忽略了这一点,很抱歉。 - cgogolin
但是你仍然无法创建一个新的分支来合并。 - GaryO
这还能用吗?当我在任一存储库中打开分支下拉菜单时,我会得到一个搜索字段,但没有匹配的分支,即使完全正确拼写,按回车键也无法选择它,所以我很困惑。 - ecv
1
“关于‘旧基础分支提交可能从时间轴中删除’的警告的含义是,如果您更改了分支(在某些已存在于新选择分支中的PR提交的情况下),则时间轴(列出那个PR包含哪些提交的列表)可能会发生变化。” - Jason Kohles
显示剩余3条评论

55

提交者可以在发起拉取请求时更改它,但一旦他们发起请求,您就无法更改它。

另一方面,您可以手动合并他们的分支和推送,这是我经常为错误定位的拉取请求所做的。

您可能会发现hub gem有助于处理拉取请求的组件。

该gem封装了手动过程,步骤如下:

  1. 为该fork添加一个远程仓库到本地仓库中。
  2. 获取该远程仓库。
  3. git checkout ${target_branch} && git merge ${remote}/${branch}
  4. git push origin ...

1
如果我手动合并并推送,Github会意识到拉取请求已经有效完成吗?有没有关于如何从远程分离的repo(fork)合并的指针? - eoinoc
3
我不确定,但并不是直接的原因——因为更改没有合并到目标分支,所以拉取请求未按定义完成。你需要手动关闭它。至于指针,请参见编辑过的评论。 - Daniel Pittman
我建议使用 git merge --no-ff ...,正如@GuillermoMansilla在他的回答中提到的那样。 - jjmontes
5
"Once they issue it you can't change it" - 从2016年8月份开始不再适用!请参见@maliayas的答案:https://dev59.com/xWox5IYBdhLWcg3wjE1h#38985999。 - Jon Schneider
2
我今天(2017年3月3日)按照以下步骤操作。我将拉取请求下载到另一个分支中,并对其进行了一些附加修复,然后合并到主分支。一旦来自拉取请求的提交合并到主分支,GitHub就会自动关闭该拉取请求。 - Ivan Krivyakov

16

除了其他答案提到的使用hub gem之外,另一种选择是使用命令行在本地合并拉取请求, 这样可以让你做到:

$ git fetch origin
$ git checkout *target_branch*
$ git merge pr/XXX
$ git push origin *target_branch*

如果您想直接使用上述命令,您需要先将以下行添加到您的.git/config文件中:

fetch = +refs/pull/*/head:refs/remotes/symbolic_name_origin_or_upstream/pr/*

那样做可以让你下载所有拉取请求。由于对于大型存储库可能不希望这样做,GitHub 修改了说明以包括git fetch origin pull/ID/head:BRANCHNAME语法,它避免了修改配置文件并仅下载单个拉取请求。

10

尽管你无法更改现有的拉取请求,因为它不是你的,但是如果相关的源存储库仍然存在(即使它是其他人的),你可以轻松地创建一个新的拉取请求。

前往提交者的存储库,然后在他/她的存储库中创建一个新的拉取请求,使用相同的提交,但确保正确设置目标分支。

然后返回到你自己的存储库并接受新的拉取请求。完美!


1
如果他们更改了他们的存储库,这还能起作用吗?如何确保它是“相同的提交记录?” - interestedparty333
如果你正在使用“分支功能”模型进行开发,那么你可以创建一个针对上游分支的分支的PR,并且它应该包含相同的提交。 - geerlingguy
2
直接在 GitHub 上执行此操作是唯一的方法,无需访问本地仓库。 - kopischke
低估的解决方案。谢谢。 - Victor Eke
被低估的解决方案。谢谢。 - Victor Eke

8

丹尼尔·皮特曼的解决方案没有问题,但我会将这些合并视为“无快进”,即更改步骤3为:

git checkout ${target_branch} && git merge --no-ff ${remote}/${branch}

通过使用 --no-ff,历史记录将更易于阅读。它将清楚地说明$n次提交来自$branch,如果您需要撤消该分支中所做的某些操作,它也会使您的生活更轻松。
另外回答eoinoc的问题并给出一个额外的提示:
合并后,您的git命令行界面将提示您编写一条消息,通常会显示一个通用消息,类似于

Merge remote-tracking branch 'user/their-branch' into your-branch

确保编辑该消息并包含对拉取请求编号的引用。即:
(假设拉取请求编号为123)

Merge remote-tracking branch 'user/their-branch' into your-branch

refs #123 solving whatever...

因此,下次访问您的github问题/拉取请求页面并检查特定的拉取请求时,您将看到带有指向您执行合并的提交链接的消息。
这是我的意思的截图。

6

要实现这个目标,请进入您的仓库主页,单击分支,将默认分支从master更改为其他内容,在我的情况下是"dev"。

之后,每当有人创建pull request时,merge按钮将自动将请求合并到"dev"而不是master中。

enter image description here


这是明目张胆的疏忽,未提前警告后果就推动这种变化。GitHub在各个方面都使用他们的“基础分支”或“默认分支”概念,改变它可能会对您的存储库的运作产生不利影响。-1. https://stackoverflow.com/questions/34068495/what-are-the-consequences-of-making-develop-the-default-branch-on-github - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接