如何在GitHub上开启多个拉取请求

175

当我在GitHub上发起一个拉取请求时,从我的上一个请求以来的所有提交和所有新提交都会自动添加到此请求中

我似乎无法控制哪些提交被添加,哪些不被添加。
当我尝试打开另一个拉取请求时,会出现“糟糕!已经有一个拉取请求”的错误。

是否有一种简单的方法可以打开多个拉取请求而不必在命令行中搞砸?

8个回答

145

拉取请求(Pull requests)是基于一个分支而产生的。
打开一个包含多个提交记录的拉取请求的唯一方法是:

  1. 将它们 隔离成它们自己的分支
  2. 从那里打开拉取请求。

3
好的,没问题。我之前以为只能在主分支上操作,现在明白了。你的意思是我可以创建多个分支(比如使用Git Flow的Feature分支),并对每个分支单独发起拉取请求,是这样吗?我想试试看! - Ziyan Junaideen
13
我发现分支保留了之前提交的历史记录,因此对上游发起的拉取请求仍包含所有提交。 - eel ghEEz
3
你好 @eel-gheez,你解决了这个问题吗?如何创建隔离的 PR(拉取请求),使得其他分支的更改不会被显示出来? - Jonathan Cross
3
这并没有解决问题:当我尝试创建一个PR时,两个分支(每个分支至少有一个提交)被进行比较。我做错了什么? - MERose
1
@eelghEEz 你应该创建一个新分支,git cherry-pick所有你想要的提交到这个分支,然后从这个分支发起一个拉取请求。这是git的一个非常重要的设计特性,每个提交都依赖于它的前一个提交,并且在git中提交不应被视为只是一个补丁,而应该是一个知道在此之前应用了什么补丁的补丁。因此,应该创建一个包含新提交的新分支,其差异可能仍然相同,但与前面的提交的链接有所不同。 - Maarten Derickx

14

您可以创建Pull Request(PR),通过为工作创建单独的分支。

例如:

  1. 您从主分支(master)检出到一个名为work-1的分支。

  2. 您在work-1分支中进行一些提交,如work-1-commit-1和work-1-commit-2

  3. 现在,您可以从work-1创建一个PR到master。 通过查看PR中的更改文件来审查您的代码。

  4. 接下来,您将从work-1分支检出到新的work-2分支以继续工作。

  5. 您在work-2分支上进行一些提交,如work-2-commit-1和work-2-commit-2

  6. 现在,您可以从work-2创建一个PR到work-1。 通过查看PR中的更改文件来审查您的代码。

在这里,文件更改只会包括work-1-commit-2之后的新代码。


1
这是与@markwisinich描述相同的流程,尽管这更加清晰。 - TonyG

11

我发现最简单的方法是使用 hub 命令(https://github.com/defunkt/hub)。

从你想要为之创建拉取请求的主题分支(在本例中为“feature”),你可以运行以下命令:

git pull-request

(记得先推送你的分支!)

它将在 GitHub 上为“YOUR_USER:feature”打开一个新的拉取请求。

如果您已经在 GitHub 上创建了问题,甚至可以将拉取请求附加到该现有问题上(这是您无法从 Web UI 完成的操作):

$ git pull-request -i 123
[ attached pull request to issue #123 ]

2
您实际上可以在不创建另一个分支的情况下完成此操作,但需要进行一些尝试。
以下是步骤:
  1. 确定您想要拉取的两个提交范围。这是我将用作示例的内容:
    (other/master)A->B->C->D->E(yours/master)
    假设您想在一个请求中拉取B和C,另一个请求中拉取D和E。
  2. 发起拉取请求。将左侧(“Base”)设置为提交A。对于右侧(“head”),输入提交C的编号。
  3. 编写第一个请求的说明。
  4. 再次发起请求。对于基础设置,输入提交C的编号,对于头部,请输入E(yours/master)。
  5. 编写说明。
据我所见,拉取请求将提交C视为分支点。或者说什么的。

即使您从自己/主分支添加提交号码,也必须将其他/主分支作为左侧保留。此方法还不允许您向合并请求添加新的提交,以防需要进行更多更改。 - frisco
我在这个答案的后续中发表了一些内容,与Github上的一些信息形成对比,请参见https://dev59.com/xn7aa4cB1Zd3GeqPvtxq。 - Mark Bennett
我可以看到这将创建两个看起来正确的PRs,因为它们各自包含完全所需的提交。但是,为明确起见,在合并它们时是否会做出正确的事情?我的意思是,我可以看到第一个PR将正确地将B和C合并到other/master。但是当第二个PR合并时,它如何知道要合并到哪个分支?(因为它是在提交“C”而不是在other/master上创建的)。 PR的合并顺序重要吗?(大概是这样) - Jonathan Hartley

1
当您首次创建拉取请求时,如果打开两个单独的表单用于新的拉取请求,只要它们指向不同的分支进行合并,就可以创建它们。例如,我可以创建两个单独的请求,一个合并到主分支,另一个合并到测试分支。

1
我是新手,对Git和GitHub不熟悉,和原帖作者有同样的问题。
我找到了一个解决方案,可能在原帖发布时还不可用。
情况:您有3个更改,希望每个更改都基于前一个构建,并且每个更改都有自己的拉取请求(PR)。
问题:当您创建第一个PR尝试将develop合并到master时,一切看起来都很好,但在为第二个PR进行更改并合并它们(使用相同的分支)之后,所有更改都在同一个PR中。
小解决方案:创建一个新的分支。
git branch mini_change_2
git checkout mini_change_2

现在你需要将代码推送到GitHub并创建PR,但默认情况下是从mini_change_2合并到master分支,但是master分支尚未包含第一个PR的更改,因此它会包含PR1和PR2的所有更改。
最佳解决方案:在PR2中指定要合并到的分支。
在创建第二个PR时不要接受默认值,而是说您将把mini_change_2合并到Develop分支,这将仅显示mini_change_2中的更改。
现在创建一个新的分支mini_change_3并将其PR到mini_change_3。
当你开始合并它们时问题就出现了...但那是另一个问题。

1
我相信你打错了字,你说“现在创建一个新的分支mini_change_3并将其PR到mini_change_3”,难道你的意思不是“现在创建一个新的分支mini_change_3并将其PR到mini_change_2”吗? - TonyG

0
如果您转到存储库页面,单击“拉取请求”,就会出现一个“新的拉取请求”按钮,您可以使用它在任意两个分支之间创建拉取请求。
这对于必须合并到主分支和开发分支(根据系统部署方式的不同,在不同时间进行)的热修复非常有用。

0
今天刚发现一个技巧,如果你不跨分支工作:
  1. 进入你的GitHub分支
  2. 点击“比较”按钮
  3. 更改基础分支进行比较
  4. 点击“创建拉取请求”
  5. ???
  6. 利润

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