如何应用未合并的上游拉请求从其他叉子到我的叉子?

GitHub上的一个项目,我有一个fork,它有一个新的pull请求,我想把它拉到我的fork中,但作者还没有拉进去。

有一个简单的方法来应用从其他叉子的拉请求到我的叉子?这里还有什么我没注意到的吗?

62042 次浏览

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

  • 添加另一个fork作为你的回购的遥控器:

    git remote add otherfork git://github.com/request-author/project.git
    
  • fetch his repo's commits

    git fetch otherfork
    
  • You have then two options to apply the pull request (if you don't want to choose pick 1.)

    1. If you don't care about applying also the eventual commits that have been added between the origin and the pull request, you can just rebase the branch on which the pull request was formed

      git rebase master otherfork/pullrequest-branch
      
    2. If you only want the commits in the pull request, identify their SHA1 and do

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

我会这样做;

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来选择特定的提交。

快乐旅行:)

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

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

举个实际的例子:

假设你fork了一个名为safaribooks的github项目,在初始项目中有以下拉请求,你想把它放在你的fork中:

enter image description here

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

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

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

我的.git/配置文件分叉回购看起来像这样:

[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”,然后列出来自fork repo的所有拉请求。

 * [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

然后在一个特定的pull请求中合并运行"git merge master origin/pr/67"

项目的Pull请求可能来自许多不同的作者(fork),您可能不希望每个fork都有一个单独的远程服务器。此外,您不希望对作者在提交pull请求时使用的分支做出任何假设,也不希望对作者的主分支中可能存在的其他内容做出任何假设。因此,最好在上游存储库中引用拉请求,而不是在其他分支中引用它。

步骤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

更新:网页

你也可以通过github网页做到这一点。

我假设,你应该已经有一个通用回购(BaseRepo)的fork (MyFork),它有来自你感兴趣的fork (OtherFork)的未决拉请求。

  1. 导航到fork (OtherFork),它已经启动了你想要进入你的fork (MyFork)的pull请求。
  2. 转到OtherFork的pull requests页面
  3. 点击新的拉请求
  4. 应该提供挂起的拉请求。记住要选择正确的OtherFork分支。选择左边作为基础叉你的叉(MyFork) (重要的)。
  5. 现在View pull request的选项应该改为Create pull request。点击这个。

现在你应该在fork (MyFork)中有一个未决的拉请求,你可以简单地接受它。

为此,我使用了一个方便的脚本。我运行脚本输入:

git prfetch upstream

它从上游fork获得所有的pull请求。

要创建脚本,请创建文件~/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中,以使更改永久生效。

现在,确保你添加了你想要获得pull请求的fork:

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

然后

git prfetch upstream