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


122

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

我有什么办法可以将更改合并到哪个分支中?

Answers:


86

从2016年8月15日开始, GitHub允许通过GUI更改拉取请求的目标分支。单击Edit标题旁边的,然后从下拉列表中选择分支。

屏幕截图

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


1
这应该是该问题的正确答案(升级到GitHub后)。
stuxnetting

似乎不再存在此功能(截至2018年2月15日),对吗?在最近的拉取请求中,目标分支以与源存储库/分支相同的浅蓝色背景上的蓝色字体显示,不再是按钮。
cgogolin '18

12
啊! 是的!首先需要单击“编辑”(从上面的屏幕截图中看不到)。我忽略了这一点。抱歉。
cgogolin '18

@cgogolin感谢您指出这一点–我也很困惑,直到阅读您的评论并单击“编辑”按钮。
mhucka

Github警告说:“当您更改拉取请求的基础分支时,某些提交可能会从时间轴中删除。” 和“来自旧基础分支的某些提交可能会从时间轴中删除。” 知道这意味着什么吗?
Matthias Fripp

55

提交者可以在发出拉取请求时进行更改,但是一旦发出,您就无法更改。

另一方面,您可以手动合并它们的分支和推送,对于定向错误的拉取请求,我会半定期执行。

您可能会发现hubgem在处理请求请求的组件方面很有帮助。

该gem包含了手动过程,即:

  1. 添加遥控器将分叉到本地结帐。
  2. 获取该遥控器。
  3. git checkout ${target_branch} && git merge ${remote}/${branch}
  4. git push origin ...

1
如果我手动合并并推送,Github是否会意识到拉取请求已有效完成?关于如何从远程单独的存储库(分支)合并的任何指针?
eoinoc'2

3
我不确定,但不能直接确定-因为更改未合并到目标分支中,所以提取请求未按定义完成。您需要手动关闭它。关于指针,请参见编辑后的注释。
丹尼尔·皮特曼

我建议使用git merge --no-ff ...@GuillermoMansilla在他的答案中提到的方法。
jjmontes '16

3
“一旦发布,您将无法更改”-截至2016年8月,情况已不再如此!参见以下@maliayas的答案:stackoverflow.com/a/38985999/12484
Jon Schneider

1
我今天(2017年3月3日)遵循了此过程。我将pull request下载到另一个分支,并对它进行了一些其他修复,然后合并到master。一旦拉取请求的提交最终在master中结束,GitHub就会自动关闭拉取请求。
伊万·克里瓦雅科夫

14

使用其他答案提到的hub gem的一种替代方法是使用命令行合并本地的pull request,这允许您执行以下操作:

$ 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语法的指令,从而避免了配置文件的修改,仅下载了单个请求请求。


8

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

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

然后返回您自己的存储库并接受新的请求。瞧!


如果他们更改了存储库,这行得通吗?如何确保它是“相同的提交”?
ragerdl 2014年

@ragerdl-如果您正在使用“每个分支的功能”模型进行开发,则可以使用针对上游分支的分支创建PR,并且该PR应该包含相同的提交。
geerlingguy 2015年

2
唯一直接在GitHub上而不需要访问本地存储库的方法。
kopischke 2015年

8

Daniel Pittman的解决方案没有错,但是我将这些合并视为“无快进”,也就是说,将步骤3更改为:

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

通过使用--no-ff,历史记录将更易于阅读。它会清楚地表明$n提交来自$branch,如果您需要还原该分支中完成的操作,也将使您的工作变得更轻松。

还可以回答eoinoc的问题并给出其他提示:

合并后,您的git cli会提示您编写一条消息,通常会显示一条通用消息,内容如下

将远程跟踪分支“用户/他们的分支”合并到您的分支中

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

将远程跟踪分支“用户/他们的分支”合并到您的分支中

裁判#123解决任何问题...

因此,下次您访问github issues / pull-requests页面并检查特定的拉取请求时,您将看到您的消息,其中包含用于提交合并位置的链接。

这是我的意思的屏幕截图。

在此处输入图片说明


6

为此,请转到存储库的主页,单击分支,然后将默认分支从master更改为其他分支,在本例中为“ dev”。

之后,无论何时有人创建拉取请求,该merge按钮都会自动将请求合并到“ dev”中,而不是master中。

在此处输入图片说明


感谢您的拼写错误@The Tin Man,我很感激
非常

4
无需感谢我们的调整/编辑。这是我们为网站所做的。继续写好答案,这已经足够了。
锡人
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.