如何使用git签出GitHub拉取请求?


249

我想签出先前创建的拉取请求(通过GitHub Web界面创建)。我搜索并找到了refs / pull或refs / pull / pr的不同地方

但是当我添加fetch = +refs/pull/*/head:refs/remotes/origin/pr/*到git配置文件并执行git fetch时

我做错了什么?GitHub应该自动创建pull / xyz东西,还是我必须配置一些东西?


配置文件的完整远程部分是什么样的?



我结束了这个问题,但实际上我需要stackoverflow.com/q/1783405/2413303
EpicPandaForce

1
第二段不是完整的句子。“但是当我添加...和做一个git取” -当你做这些事是什么情况?
cp.engr

Answers:


382

要将远程PR提取到本地仓库中,

git fetch origin pull/ID/head:BRANCHNAME

哪里ID是拉取请求ID,BRANCHNAME是您要创建的新分支的名称。创建分支后,只需

git checkout BRANCHNAME

有关更多信息,请参见官方GitHub文档


11
我用它从上游存储库中获取一个PR到我的本地分叉存储库中,您也可以用上游替换源。
Jngai1297 '16

18
我的命令最终看起来像git fetch origin pull/1/head:githubusername不是我期望的那样
安东尼

1
如何还原?
fico7489

8
@Antoine BRANCHNAME是您想要命名分支的任何名称。我猜想您尝试使用一个已经存在的名称(例如master),但该名称不起作用,因此您尝试了有效的用户名,因为用户名不是该名称的分支。也许我误会了你在说什么。
Nateowami

1
可能是您以origin指向分支和upstream–原始存储库的方式配置了本地存储库(例如,在help.github.com/articles/configuring-a-remote-for-a-fork之后)。如果要从原始存储库获取拉取请求,请确保更改originupstream上述命令。
mvlabat

125

无需命名分支即可获取:

git pull origin pull/939/head

如何在机器上获得特定的拉取请求?


tks
rll

这项功能对我
有用

29
请注意,例如,如果在master分支上执行此操作,它将直接提交到该分支。如果要将拉取请求带到一个单独的分支进行暂存,请尝试@timbo的答案。
凤凰城

3
同上@phoenix说的话。我希望在我的计算机上将拉取请求分支复制到它自己的分支(而不是主分支)下。
Paul Chernoch '17

如果您以后想要将更改从拉取请求中拉到您的本地分支中,这也可以使用。
luator

51

要点确实描述了执行git fetch时发生的情况:

显然,更改github URL以匹配您项目的URL。最终看起来像这样:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:joyent/node.git
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

现在获取所有拉取请求:

$ git fetch origin
From github.com:joyent/node
 * [new ref]         refs/pull/1000/head -> origin/pr/1000
 * [new ref]         refs/pull/1002/head -> origin/pr/1002
 * [new ref]         refs/pull/1004/head -> origin/pr/1004
 * [new ref]         refs/pull/1009/head -> origin/pr/1009
...

要检查特定的拉取请求:

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

您可以在第259期中列出各种脚本来自动化该任务。
混帐额外的项目提出了命令git-pr(在实施PR 262

git-pr(1)-在本地签出拉取请求

概要

git-pr <number> [<remote>]
git-pr clean

描述

根据GitHub拉取请求编号创建一个本地分支,然后切换到该分支。

要获取的远程服务器的名称。默认为origin

例子

226将从origin以下位置检出拉取请求:

$ git pr 226

remote: Counting objects: 12, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 12 (delta 3), reused 9 (delta 3)
Unpacking objects: 100% (12/12), done.
From https://github.com/visionmedia/git-extras
  * [new ref] refs/pull/226/head -> pr/226
Switched to branch 'pr/226'

37

我更喜欢在不创建本地分支的情况下进行获取和签出,并且处于HEAD分离状态。它使我可以快速检查请求请求,而不会因为不必要的本地分支而污染本地计算机。

git fetch upstream pull/ID/head && git checkout FETCH_HEAD

在哪里ID是拉取请求ID,upstream在哪里创建了原始拉取请求(origin例如,可以是)。

希望对您有所帮助。


1
我喜欢这个解决方案。好处之一是,如果PR用更多提交进行了更新,则可以再次运行它,它将拉入新的提交。
亚历·约翰逊

13

参考Steven Penny的答案,最好创建一个测试分支并测试PR。所以这就是你要做的。

  1. 创建一个测试分支以将PR合并到本地。假设您在master分支上:

git checkout -b test

  1. 将PR更改放入测试分支

git pull origin pull/939/head:test

现在,您可以在此本地测试分支(在本例中为test)中安全地测试更改,一旦满意,就可以照常从GitHub进行合并。


1
我什至会更好-我将创建一个工作树,将其设置为新test分支,然后拉入PR-这样一来,完成后就无需在本地还原分支;我只是处理工作树。实际上,我checkout -b再也没有了-我总是创建一个工作树然后分支。磁盘便宜。当然,我有一个脚本可以做到这一点。我没有单独输入所有需要的命令。
mpersico

10

如果您使用的是Github.com,请转到“请求请求”,单击相关的请求请求,然后单击“命令行指令”链接: Github.com上的命令行说明


说,实际上有一种方法-当您查看github.com时-是下载PR的新文件/更改文件吗?因此,当您在github上查看存储库时,可以单击方便的“以zip下载”按钮,或者确实可以非常简单地单击并仅查看项目的每个文件。对于PR,我看不到如何简单地单击以“查看文件”-知道我的意思吗?我想念什么吗?干杯!
Fattie

8

您可以使用git config命令编写新规则以.git/config从存储库中获取拉取请求:

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

然后:

$ git fetch origin
Fetching origin
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/container-images/memcached
 * [new ref]         refs/pull/2/head -> origin/pr/2
 * [new ref]         refs/pull/3/head -> origin/pr/3

6

上面某些选项的问题在于,如果有人在打开PR后将更多提交提交到PR,他们将不会为您提供最新版本。对我来说,最有效的方法是-转到PR,然后按“提交”,滚动到底部以查看最新的提交哈希 在此处输入图片说明 ,然后简单地使用git checkout,即

git checkout <commit number>

在上面的例子中

git checkout 0ba1a50


2
我用stackoverflow.com/a/30584951/659732中git fetch origin pull/ID/head:BRANCHNAME提到的方法完全解决了这个问题。感谢您的解决方案!
joewiz


4

对于Bitbucket,您需要将替换pullpull-requests

首先,您可以通过git ls-remote origin命令确认拉取请求URL的样式。

$ git ls-remote origin |grep pull
f3f40f2ca9509368c959b0b13729dc0ae2fbf2ae    refs/pull-requests/1503/from
da4666bd91eabcc6f2c214e0bbd99d543d94767e    refs/pull-requests/1503/merge
...

如您所见,它refs/pull-requests/1503/from代替了refs/pull/1503/from

然后,您可以使用任何答案的命令。


3

我无意间写了几乎和git-extras一样的东西。因此,如果您希望使用单个自定义命令而不是安装其他命令,只需将该git-pr文件放在您的计算机中的某个位置$PATH,然后就可以编写:

git pr 42
// or
git pr upstream 42
// or
git pr https://github.com/peerigon/phridge/pull/1

3

如果您遵循“ github fork”工作流程,则在其中创建一个fork并添加远程上游仓库:

14:47 $ git remote -v
origin  git@github.com:<yourname>/<repo_name>.git (fetch)
origin  git@github.com:<yourname>/<repo_name>.git (push)
upstream        git@github.com:<repo_owrer>/<repo_name>.git (fetch)
upstream        git@github.com:<repo_owner>/<repo_name>.git (push)

插入当前分支,您的命令将如下所示:

git pull upstream pull/<pull_request_number>/head

插入新分支的代码如下所示:

git fetch upstream pull/<pull_request_number>/head:newbranch

3

Github最近发布了一个名为github-cli的cli实用程序。安装后,您可以使用其ID在本地检出拉取请求的分支

例如: gh pr checkout 2267

请注意,该软件包仍处于测试阶段


1

使远程PR分支进入本地分支:

git fetch origin ‘remote_branch’:‘local_branch_name’

将本地分支的上游设置为远程分支。

git branch --set-upstream-to=origin/PR_Branch_Name local_branch

当您想将本地更改再次推送到PR分支时

git push origin HEAD:remote_PR_Branch_name


0

假设您的来源和上游信息如下所示

   $ git remote -v
   origin  git@github.com:<yourname>/<repo_name>.git (fetch)
   origin  git@github.com:<yourname>/<repo_name>.git (push)
   upstream   git@github.com:<repo_owner>/<repo_name>.git (fetch)
   upstream   git@github.com:<repo_owner>/<repo_name>.git (push)

您的分支名称是

   <repo_owner>:<BranchName>

然后

   git pull origin <BranchName>

应该做这份工作


当您共享代码时,请尝试解释您的代码
Yunus Temurlenk

-2

如果他们的提交在他们的分叉仓库的主分支上,那么您可以执行以下操作。

git fetch git@github.com:<repo_owner>/<repo_name>.git
git checkout FETCH_HEAD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.