如何获取我不拥有的分支的未合并拉取请求?

时间:2011-07-19 07:16:24

标签: git github git-pull pull-request

我需要在NServiceBus repo中提取一个特定的pull请求(尚未处理到主流中):

https://github.com/johnsimons/NServiceBus/commit/d8524d53094e8181716e771c1023e968132abc15

这显然不是我的回购,但我需要拉动请求中存在的更改。

这样做的最佳方式是什么?

13 个答案:

答案 0 :(得分:69)

要获取存储库中的内容:

git fetch git@github.com:jboss/jboss-common-beans.git refs/pull/4/head

然后用FETCH_HEAD做任何你想做的事:

git checkout -b new-branch FETCH_HEAD

答案 1 :(得分:53)

git pull origin pull/28/head

或者

git fetch origin pull/28/head:28
git checkout 28

Can I pull a not-yet-merged pull request?

答案 2 :(得分:17)

你可以这样做:

1)添加上游远程:

git remote add upstream git@github.com:Particular/NServiceBus.git

2)之后,您可以根据其ID检查对新分支的任何拉取请求:

git fetch upstream pull/PULL_REQUEST_ID/head:NEW_BRANCH_NAME

然后您将拥有一个名为NEW_BRANCH_NAME的分支,其中包含PR代码。

添加别名:

如果您像我一样经常这样做,您可能需要为此设置some aliases。 我在.gitconfig中有这个:

[alias]
    fetch-pr = "!f(){\
        [ -z \"$1\" ] && { echo Usage: git fetch-pr PULL_REQUEST_ID [REMOTE_NAME] [NEW_BRANCH_NAME]; exit 1; }; \
        remote=${2:-origin}; \
        branch=${3:-pr-$1}; \
        git fetch $remote \"pull/$1/head:$branch\"; \
        }; f "
    pr = "!f(){\
        branch=${3:-pr-$1}; \
        git fetch-pr \"$@\"; \
        git switch $branch; \
        }; f "

有了上述内容,我可以做到:

git fetch-pr 123              # fetch PR #123 into branch pr-123
git fetch-pr 123 some-branch  # fetch PR #123 into some-branch
git pr 123                    # fetch and switch to the branch

答案 3 :(得分:8)

对于困难的情况(特别是如果你没有签出git-repo),我认为最简单的方法是应用补丁。为此,只需在github上打开pull-request并在URL中添加“.patch”,下载并应用补丁。

示例:

cd cordova-plugin-media
wget https://github.com/apache/cordova-plugin-media/pull/120.patch
patch -p1 < 120.patch

答案 4 :(得分:5)

答案 5 :(得分:4)

<强>的github /集线器

https://github.com/github/hub是一个GitHub CLI帮助程序,可以使用GitHub API中的额外信息精确地处理此用例和其他用例。 E.g:

git clone https://github.com/github/hub
# Just copy paste the URL.
hub checkout https://github.com/github/hub/pull/970

结果:

  • 我们现在位于名为<USERID>-<BRANCH_NAME>的分支上,其中包含PR。

    请注意为我们自动设置的好分支名称。

  • 该分支设置为跟踪分叉上的原始分支,即.git/config包含:

    [branch "<USERID>-<BRANCH_NAME>"]
        remote = retronym
        merge = refs/heads/ticket/969
        rebase = true
    

    因此,如果进一步提交,我们可以直接git fetch

如果你不熟悉Go,那么在Linux上安装hub是一件很痛苦的事情,但是值得。在Ubuntu 14.04上,存储库中的Go太旧了,因此GVM是最佳选择:

bash < <(curl -LSs 'https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer')
. "$HOME/.gvm/scripts/gvm"
gvm install 'go1.4'
gvm use 'go1.4' --default
go get github.com/github/hub

我还要求GitHub在网页用户界面上给我们一份复制粘贴备忘单:https://github.com/isaacs/github/issues/449

答案 6 :(得分:3)

将上游仓库添加为上游远程(如@elias指出):

$ git remote add upstream git@github.com:Particular/NServiceBus

默认情况下,您可以将git配置为获取拉取请求:

$ git config --local --add remote.upstream.fetch '+refs/pull/*/head:refs/remotes/upstream/pr/*'

所以,让我们来取它:

$ git fetch upstream
Fetching upstream
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/Particular/NServiceBus
 * [new ref]         refs/pull/1/head -> upstream/pr/1
 * [new ref]         refs/pull/2/head -> upstream/pr/2

并查看:

$ git checkout pr/2
Branch pr/2 set up to track remote branch pr/2 from upstream.
Switched to a new branch 'pr/2'

答案 7 :(得分:0)

下面是让你的'git fetch'命令在运行“git fetch”时获取所有拉取请求

将以下内容添加到〜/ .gitconfig

[remote "origin"]
fetch = +refs/pull-requests/*/from:refs/remotes/origin/pr/*

注意引用“refs / pull-requests /”有stash命名约定,对于git hub,你可能需要不同的格式

答案 8 :(得分:0)

如果您只想将其他回购中的一个未合并的“拉取请求”添加到自己的回购请求中, 并不需要所有并发症(如其他答案所示)。

相反,只需进入自己的存储库,并使用其提交哈希值(从PR来源)提取提交即可。

git pull https://bitbucket.org/SomeUser/SomeProjectRepo/commits/c15...db2

通过这种方式,您将只有一堆新的编辑文件,就像您自己编辑它们一样。如果您要提交这些标签/标签,则由您决定。

如果您随后想要将所有新闻推送到自己的GitHub存储库中,请像往常一样执行:

git commit -m "Added something by Anonymous"
git push -u origin master

答案 9 :(得分:0)

这是对我有用的命令。

我假设一个人已经在本地将一个仓库(例如pytorch)克隆到他/她的系统中。此后,一些志愿者/热心者贡献了一些代码并向远程存储库发布了PR,但它尚未合并到主数据库或任何其他分支中。因此,

首先,我们必须对github远程存储库进行 git remote add

# I've given the name `original`; you can give some other name as per your liking
$ git remote add original https://github.com/pytorch/pytorch

然后cd进入存储库pytorch,然后只需执行以下操作:

# after this, the unmerged PR should be pulled to your local repo
$ git fetch original pull/<pull_number>/head    # 23, 123 etc.,

现在,待处理的PR已获取到您的本地存储库中,并且获取的提示将在FETCH_HEAD中。如果您要在本地合并此待处理的PR ,只需执行以下操作:

$ git merge FETCH_HEAD

在此之后,如果您这样做:

$ git status

您应该能够看到本地回购在作为待处理PR的n提交之前(即,在一个PR中可以发出1个以上的提交)。因此,提交的数量取决于挂起的PR中包含的提交。

答案 10 :(得分:0)

Github有明确的文档,用于将拉取请求合并到 local 回购中:

https://help.github.com/en/articles/checking-out-pull-requests-locally

可以归结为知道GitHub中的拉取请求只是基础存储库中的分支,其中分支名称是序列号。上面的文章向您展示了如何找到该数字以及git命令行魔术师如何使用您想要的任何分支名称将其拉入本地存储库。

我找不到类似的简单方法将拉取请求合并到我在GitHub上创建的fork中。

答案 11 :(得分:0)

我找到了解决此问题的方法-从不同机器上未合并的PR中提取更改,我在git bash上进行了以下操作 1.您必须已在机器2上克隆了远程存储库 2.进行git checkout(生成PR的分支) 3.做git pull  并完成!!!!!!!!!!!!!!

答案 12 :(得分:0)

这是GitHub文档中的解决方案:

从您的项目存储库中,签出一个新分支并测试更改。

git checkout -b GithubUserID-branchName branchName
git pull https://github.com/GithubUserID/reponame.git branchName

位置:

  1. GithubUserID是打开请求请求的人的用户名。
  2. branchName是分支的名称,例如master
  3. reponame存储库名称,例如demo-todo

示例:

git checkout -b felix123-master master
git pull https://github.com/felix123/demo-todo.git master