如何将来自其他分叉的未合并上游拉取请求应用于我的分叉?


464

我有一个分支的GitHub上的项目有一个新的pull请求,我想将其拉到作者尚未拉入的分支中。

有没有简单的方法可以将来自其他分叉的拉取请求应用于我的分叉?这里还有我想念的东西吗?



如果您使用git命令这样做,这是否会反映在GitHub的网络图上?
ADTC

找到所有分支机构也可能很有趣:stackoverflow.com/q/47798937/10245
Tim Abell,

Answers:


276

您可以很容易地手动进行操作:

  • 将另一个fork添加为您的仓库的远程目录:

    git remote add otherfork git://github.com/request-author/project.git
    
  • 获取他的回购的承诺

    git fetch otherfork
    
  • 然后,您有两个选项可以应用拉取请求(如果您不想选择选择1)。

    1. 如果您不在乎还应用已在原始请求和请求请求之间添加的最终提交,则只需为形成请求请求的分支重新设置基础

      git rebase master otherfork/pullrequest-branch
      
    2. 如果仅在提交请求中需要提交,请标识其SHA1并执行

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      

166
实际上,您不应该使用cherry-pick,它会创建新的提交...如果在上游发送拉取请求,这又会引起混乱。相反,您应该像合并请求所要求的那样合并。您也不需要添加遥控器。 git pull URL branchname
2011年

3
@Tekkub:同意,最好避免与新创建的提交混淆。合并在我看来不太优雅,因为您可以从要合并的分支中带来其他更改
CharlesB 2011年

8
是的,但在这种情况下,他特别询问如何将拉动请求拉入他的叉子。拉==合并。
2011年

1
@CharlesB,因为GitHub自动将同一分支上的新提交添加到拉取请求中,所以不难获得任何“其他更改”(假设请求者遵循最佳实践,并将这些更改与持续开发放在单独的分支上,因此(所有提交都是相关的),除非您只是想在请求请求的一部分时得到什么?
neverfox

4
对于那些有同感的人,“ otherfork”不是在引用原始存储库,而是在从向原始存储库发出拉取请求的fork提交。忽略原始仓库,直接进入发出拉取请求的货叉。您想手动拉取拉取引用的提交并将其与您自己的提交合并。
Michael Khalili 2014年

282

更新:通过网页

您也可以通过github网页执行此操作。

我想,您应该已经有一个MyFork公共仓库(BaseRepo)的叉子(),其中有OtherFork您感兴趣的来自叉子()的挂起请求。

  1. 导航到OtherFork发起了请求的派生叉(),您希望将其插入到派生叉(MyFork)中
  2. 转到的拉取请求页面 OtherFork
  3. 点击新的拉取请求
  4. 应该提供未决的请求请求。记住也要选择适当的OtherFork分支。在左侧选择您的货叉(MyFork)(重要)作为基础货叉。
  5. 现在,的选项View pull request应更改为Create pull request。点击这个。

现在,您应该在fork(MyFork)中有一个待处理的pull请求,您可以简单地接受它。


6
做工精美。比cmd行简单得多,并且易于查看更改。谢谢。
Alveoli

3
我在如何找到UI上的“ OtherFork”时遇到了麻烦。要轻松到达那里,只需使用github用户名修改网址。即github.com/userName/repoName
Charles

2
我看不到第4步中提到的挂起的请求。相反,我OtherFork从右侧的“比较”下拉列表中选择了与所提出的请求相对应的分支。然后,如上所述,如上所述,我选择左侧作为基叉,从而能够创建拉动请求。
seddonym 2015年

除非没有叉子,否则有效。例如:github.com/OculusVR/RakNet/pull/61/files
MilanBabuškov16年

1
githubs站点上的确切单词可能已经过时,但是过程已经完成。超级简单-谢谢!
kevnk

73

就像Tekkub之前所说的,您可以直接将分支拉入。大多数情况下,使用GitHub时,分支只是项目的请求用户分支上的“主”。

例: git pull https://github.com/USER/PROJECT/ BRANCH

作为一个实际的例子:

假设您对一个名为safaribooks的github项目进行了分叉,并且在原始项目中有以下要放入您的fork的pull请求:

在此处输入图片说明

然后,在fork的克隆项目文件夹中,运行:

git pull https://github.com/fermionic/safaribooks.git fix-str-decode

20
缺点是分支除了拉取请求外可能还包含其他内容。另外,您还必须为拉取请求作者的fork查找正确的URL。如果要使用单线,最好使用git pull https://github.com/{upstream/project} refs/pull/{id}/head单线。
jbyler 2014年

1
@jbyler如果分支中包含其他内容,我很确定GitHub仍然会使用它们更新pull请求。
蒂姆·马隆

22

该项目的请求请求可能来自许多不同的作者(分支),并且您可能不希望每个分支都有单独的遥控器。此外,您也不想对提交提交请求时作者使用的分支或作者的master分支中的其他内容进行任何假设。因此,最好参考在上游存储库中出现的拉取请求,而不是在其他派生中出现的引用。

步骤1:

git remote add upstream <url>

您可能已经完成了此步骤,但是如果没有,您将需要为上游项目定义一个远程。该URL是您分叉的项目的克隆URL。有关为分叉配置遥控器同步分叉的更多信息。 upstream是您为遥控器指定的名称,虽然可以是任何upstream名称,但它 是常规名称。

第2步:

git pull upstream refs/pull/{id}/head

... {id}提取请求编号在哪里。 upstream是要从中拉出的遥控器的名称,即如果完全按照步骤1进行操作,则只是“上游”。它也可以是URL,在这种情况下,您可以跳过步骤1。

第三步:

输入用于合并提交的提交消息。您可以保留默认值,尽管我建议给出一个漂亮的单行摘要,其中包含拉取请求编号,它已解决的问题以及简短说明:

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions

另请参阅一个具有变体的相关答案,该变体创建带有拉取请求的本地分支。最后一个变种:您可以git pull upstream refs/pull/{id}/head用来将提交提交到本地存储库中,然后将其引用为FETCH_HEAD(例如git log ..FETCH_HEAD,查看其中的内容,然后git merge FETCH_HEAD
jbyler 2014年

我将如何进行基础调整,因此拉动请求位于最前面,我可以避免合并泡沫?
迈克尔·约翰斯顿

1
这是我需要的解决方案,因为请求请求的作者已经删除了他的仓库。
jswetzen

20

一些对我有用的更详细的信息。

我的分叉仓库的.git / config文件如下所示:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = git@github.com:litzinger/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
[remote "source"]
        url = git://github.com/revolunet/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/source/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

然后运行“ git fetch source”,然后列出来自分叉存储库的所有拉取请求。

 * [new ref]         refs/pull/54/head -> origin/pr/54
 * [new ref]         refs/pull/67/head -> origin/pr/67
 * [new ref]         refs/pull/69/head -> origin/pr/69
 * [new ref]         refs/pull/71/head -> origin/pr/71

然后要合并到特定的请求请求中,请运行“ git merge master origin / pr / 67”


1
我编辑了.git / config并添加了[remote“ source”]行,但是对于我感兴趣的项目,说明可以正常工作。我喜欢这个答案。
菲洛维维罗

3
可以在news.ycombinator.com/item?id=9051220help.github.com/articles/checking-out-pull-requests-locally提示有关此GitHub特有的只读远程refs/pull/命名空间的信息中找到出色的相关建议。。
菲利普·德宾

如果您使用Smartgit,则smartgit.branch.otherRefs=notes;pull按照syntevo.com/doc/display/SG/System+Properties添加到smartgit.properties中时,可以在日志图中看到这些拉取请求(和关闭的请求)-您也可以从那里合并它们。
CAD bloke

顺便说一句,您也可以在命令行上使用git fetch source + refs / heads / *:refs / remotes / upstream / * + refs / pull / * / head:refs / remotes / origin / pr / *
lib

9

我要做的是以下几点;

git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#

我现在将更改合并到名为的测试分支中test_fork。这样任何更改都不会弄脏我的树。

您可以选择使用上述的Cherry-pick来选择特定的提交(如果更可取的话)。

旅途愉快 :)


0

我为此使用了方便的花花公子脚本。我通过键入以下命令运行脚本:

git prfetch upstream

并从上游分叉获取所有拉取请求。

要创建脚本,请创建一个文件~/bin/git-prfetch

该文件应包含以下内容:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Please supply the name of a remote to get pull requests from."
    exit 1
fi

git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*

通过设置以下内容,确保您的路径包含脚本:

export PATH="$HOME/bin:$PATH"

您可以添加此文件~/.bashrc以使更改永久生效。

现在,确保您添加了您要从中获取拉取请求的叉子:

git remote add upstream https://github.com/user/repo.git

然后

git prfetch upstream
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.