509

我有一个 fork 的 GitHub 上的一个项目有一个新的 pull requests,我想将其拉入我的 fork 中,而作者尚未拉入。

有没有一种简单的方法可以将来自其他分叉的拉取请求应用到我的分叉中?这里还有什么我想念的吗?

4

7 回答 7

328

更新:通过网页

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

我假设,您应该已经有一个MyFork公共 repo () 的 fork (),其中包含来自您感兴趣BaseRepo的 fork () 的待处理拉取请求。OtherFork

  1. 导航到OtherFork已发起拉取请求的 fork ( ),您希望将其放入 fork ( MyFork)
  2. 转到拉取请求页面OtherFork
  3. 单击新的拉取请求
  4. 应提供待处理的拉取请求。记住也要选择正确的OtherFork分支。选择左侧作为您的前叉 ( MyFork) (重要) 的基叉。
  5. 现在选项View pull request应该更改为Create pull request. 点击这个。

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

于 2015-02-25T21:02:02.240 回答
293

您可以很容易地手动完成:

  • 将另一个叉子添加为您的仓库的远程:

    git remote add otherfork git://github.com/request-author/project.git
    
  • 获取他的 repo 的提交

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

    1. 如果您不关心应用在源和拉取请求之间添加的最终提交,您可以重新设置拉取请求所基于的分支

      git rebase master otherfork/pullrequest-branch
      
    2. 如果您只想要拉取请求中的提交,请确定他们的 SHA1 并执行

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      
于 2011-05-16T19:31:59.200 回答
80

就像 Tekkub 之前说的,你可以直接把分支拉进去。大多数情况下,在 GitHub 上,分支只是请求用户的项目分支上的“主”。

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

作为一个实际的例子:

假设您分叉了一个名为 safaribooks 的 github 项目,并且在原始项目中有以下拉取请求,您希望将其放入您的分叉中:

在此处输入图像描述

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

git pull https://github.com/fermionic/safaribooks.git fix-str-decode
于 2012-07-26T18:58:37.543 回答
28

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

第1步:

git remote add upstream <url>

您可能已经完成了这一步,但如果没有,您将需要为上游项目定义一个远程。该 URL 是您分叉的项目的克隆 URL。更多信息见为 fork 配置远程同步 forkupstream是你给遥控器的名字,虽然它可以是任何东西,但它 upstream是传统的名字。

第2步:

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

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

第 3 步:

输入合并提交的提交消息。您可以保留默认值,但我建议提供一个漂亮的单行摘要,其中包含拉取请求编号、它修复的问题和简短描述:

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions
于 2014-10-20T22:37:57.823 回答
22

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

我用于分叉存储库的 .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”

于 2013-11-18T21:50:35.670 回答
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 来选择特定的提交。

旅途愉快 :)

于 2011-05-17T00:46:53.710 回答
1

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

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
于 2019-08-01T20:35:07.837 回答