我有一个 fork 的 GitHub 上的一个项目有一个新的 pull requests,我想将其拉入我的 fork 中,而作者尚未拉入。
有没有一种简单的方法可以将来自其他分叉的拉取请求应用到我的分叉中?这里还有什么我想念的吗?
我有一个 fork 的 GitHub 上的一个项目有一个新的 pull requests,我想将其拉入我的 fork 中,而作者尚未拉入。
有没有一种简单的方法可以将来自其他分叉的拉取请求应用到我的分叉中?这里还有什么我想念的吗?
您也可以通过 github 网页执行此操作。
我假设,您应该已经有一个MyFork
公共 repo () 的 fork (),其中包含来自您感兴趣BaseRepo
的 fork () 的待处理拉取请求。OtherFork
OtherFork
已发起拉取请求的 fork ( ),您希望将其放入 fork ( MyFork
)OtherFork
OtherFork
分支。选择左侧作为您的前叉 ( MyFork
) (重要) 的基叉。View pull request
应该更改为Create pull request
. 点击这个。现在,您的 fork ( MyFork
) 中应该有一个待处理的拉取请求,您可以简单地接受它。
您可以很容易地手动完成:
将另一个叉子添加为您的仓库的远程:
git remote add otherfork git://github.com/request-author/project.git
获取他的 repo 的提交
git fetch otherfork
然后,您有两个选项来应用拉取请求(如果您不想选择选择 1。)
如果您不关心应用在源和拉取请求之间添加的最终提交,您可以重新设置拉取请求所基于的分支
git rebase master otherfork/pullrequest-branch
如果您只想要拉取请求中的提交,请确定他们的 SHA1 并执行
git cherry-pick <first-SHA1> <second-SHA1> <etc.>
就像 Tekkub 之前说的,你可以直接把分支拉进去。大多数情况下,在 GitHub 上,分支只是请求用户的项目分支上的“主”。
例子:git pull https://github.com/USER/PROJECT/ BRANCH
作为一个实际的例子:
假设您分叉了一个名为 safaribooks 的 github 项目,并且在原始项目中有以下拉取请求,您希望将其放入您的分叉中:
然后,在你的 fork 的克隆项目文件夹中,运行:
git pull https://github.com/fermionic/safaribooks.git fix-str-decode
项目的拉取请求可能来自许多不同的作者(分叉),您可能不希望每个分叉都有单独的遥控器。此外,您不想对作者在提交拉取请求时使用的分支或作者的主分支中可能存在的其他内容做出任何假设。因此,最好在上游存储库中引用拉取请求,而不是在其他分支中出现。
第1步:
git remote add upstream <url>
您可能已经完成了这一步,但如果没有,您将需要为上游项目定义一个远程。该 URL 是您分叉的项目的克隆 URL。更多信息见为 fork 配置远程和同步 fork。 upstream
是你给遥控器的名字,虽然它可以是任何东西,但它 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
一些更详细的信息对我有用。
我用于分叉存储库的 .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”
我要做的是以下内容;
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 来选择特定的提交。
旅途愉快 :)
我为此使用了一个方便的花花公子脚本。我通过键入以下内容运行脚本:
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