GitHub:如何将开放的拉取请求添加到本地存储库?

24

我在我的iOS Xcode项目中使用NSDate-Extensions插件。主分支存在一些错误,这些错误看起来在两个拉取请求中已经得到修复:

这些请求仍然是未解决的,没有被接受到主分支。如何以Git方式将它们添加到我的本地存储库?如果他们的分支稍后更新,那么我的本地存储库会跟着更新就好了:


可能是重复的问题:从其他分支请求合并到我的分支 - CharlesB
可能是重复的问题:git:如何获取一个我不拥有的分支的未合并的拉取请求? - Ciro Santilli OurBigBook.com
4个回答

21
你可以在不添加远程仓库的情况下从命令行拉取请求:

您可以从命令行中拉取请求而无需添加远程仓库:

git pull https://github.com/erica/NSDate-Extensions +refs/pull/6/head

如果您还不确定是否要这样做,那么您可能希望首先使用以下命令检查该分支:

git fetch https://github.com/erica/NSDate-Extensions +refs/pull/6/head:refs/origin/pull/6

相对于使用补丁文件,这样做的优点在于git可以获取实际提交记录。因此,git可以看到主分支之前何时已经合并到拉取请求中。而补丁文件则完全没有意识到这种差异。


15

在拉取的URL末尾添加一个.patch - 您可以下载并将补丁应用于您的repo:

curl https://github.com/erica/NSDate-Extensions/pull/6.patch | git am

在执行了上述命令后,补丁已成功应用,但当我运行 git status 时,它说没有任何更改。为什么这个补丁可以改变我的本地仓库,但仍然说没有任何更改? - dhrm
@manojlds:不错的技巧!你的答案也适用于https://dev59.com/6m025IYBdhLWcg3wZ1Ny - CharlesB
1
@DennisMadsen:git am 不仅仅是应用补丁。pull / *.patch 实际上是多个补丁(每个拉取请求中的提交一个)。每个补丁都被应用为提交。因此,在此之后没有未提交的更改(git status 可能会显示)。 - JonnyJD
这仅适用于从主分支中未合并提交的简单拉取请求。因此,我始终更喜欢使用实际的拉取请求分支,例如https://dev59.com/NWox5IYBdhLWcg3w6oj0#18096344。 - JonnyJD
看起来 GitHub 发生了一些变化。那个 URL 只是一个重定向/链接到 https://patch-diff.githubusercontent.com/raw/erica/NSDate-Extensions/pull/6.patch。不过,替换成新的 URL 就可以了。 - Sparhawk
@Sparhack @dhrm 如果你喜欢旧的URL格式,可以使用curl -L来跟随重定向。 - Soren Bjornstad

12

您应该将提出拉取请求的仓库添加为远程仓库:

  • 找到贡献此链接的人(通常只需单击sha1哈希)

  • 执行以下操作:

git remote add githubuser theirgithubfork.git

然后你可以轻松地拉取他们的更改:

  • git fetch githubuser

轻松获取单个提交记录。

  • git cherry-pick thesha1fromthepullrequest

举个完整的例子,可以想象一下 Ruby Capistrano 项目中由 RogerE 提交的 pull request (6bbbcc5),具体可以参考这个链接

$ git clone git@github.com:capistrano/capistrano.git
$ cd capistrano
$ git remote add RogerE https://github.com/RogerE/capistrano.git
$ git fetch RogerE
$ git cherry-pick 6bbbcc5

那我应该从 Erica 的原始 repo 克隆,然后针对 Ricardo1980 和 exalted 的两个派生版本都运行 "git remote add"?如果我之后执行 "git pull",它会只从原始 repo 拉取更新吗,还是也会拉取两个远程的更新呢? - dhrm
git fetch 只会下载更改,但在您指定合并命令(例如 git mergegit rebase)之前不会实际合并它们。 - Ramon Marco L. Navarro
好的,那么没有一种使用单个拉取命令同时从三个存储库获取更新的方法吗? - dhrm
不,您必须将想要获取更改的每个存储库添加为远程仓库,fetch(下载提交)所有存储库。然后选择要使用的提交 cherry-pick。Cherry-pick 会保留提交的作者和 SHA1 哈希值。如果 origin 存储库将它们合并到主分支中,按照这种方式工作就不会出现合并冲突问题。 - Lee Hambley
当你执行 git pull 命令时,实际上默认会扩展为 git pull origin master。在你的例子中,你的 origin 远程是 erica。因此,当你执行 git pull 命令时,你会从 erica 拉取 master 分支。远程仓库并没有参与其中,这是设计上的考虑。 - Lee Hambley
显示剩余2条评论

-3

你可以这样拉取特定的拉请求:

git pull https://github.com/erica/NSDate-Extensions/pull/6
git pull https://github.com/erica/NSDate-Extensions/pull/7

我认为这比添加远程(特别是仅需要一次性修复)或通过curl管道传输要容易得多。


这个想法是正确的,但它并不像那样工作,这可能是被踩的原因。我在 https://dev59.com/NWox5IYBdhLWcg3w6oj0#18096344 上添加了一个可行的答案,与这个想法相同。 - JonnyJD

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