我想签出先前创建的拉取请求(通过GitHub Web界面创建)。我搜索并找到了refs / pull或refs / pull / pr的不同地方
但是当我添加fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
到git配置文件并执行git fetch时
我做错了什么?GitHub应该自动创建pull / xyz东西,还是我必须配置一些东西?
我想签出先前创建的拉取请求(通过GitHub Web界面创建)。我搜索并找到了refs / pull或refs / pull / pr的不同地方
但是当我添加fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
到git配置文件并执行git fetch时
我做错了什么?GitHub应该自动创建pull / xyz东西,还是我必须配置一些东西?
Answers:
要将远程PR提取到本地仓库中,
git fetch origin pull/ID/head:BRANCHNAME
哪里ID
是拉取请求ID,BRANCHNAME
是您要创建的新分支的名称。创建分支后,只需
git checkout BRANCHNAME
有关更多信息,请参见官方GitHub文档。
git fetch origin pull/1/head:githubusername
不是我期望的那样
BRANCHNAME
是您想要命名分支的任何名称。我猜想您尝试使用一个已经存在的名称(例如master
),但该名称不起作用,因此您尝试了有效的用户名,因为用户名不是该名称的分支。也许我误会了你在说什么。
origin
指向分支和upstream
–原始存储库的方式配置了本地存储库(例如,在help.github.com/articles/configuring-a-remote-for-a-fork之后)。如果要从原始存储库获取拉取请求,请确保更改origin
为upstream
上述命令。
要点确实描述了执行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'
我更喜欢在不创建本地分支的情况下进行获取和签出,并且处于HEAD分离状态。它使我可以快速检查请求请求,而不会因为不必要的本地分支而污染本地计算机。
git fetch upstream pull/ID/head && git checkout FETCH_HEAD
在哪里ID
是拉取请求ID,upstream
在哪里创建了原始拉取请求(origin
例如,可以是)。
希望对您有所帮助。
参考Steven Penny的答案,最好创建一个测试分支并测试PR。所以这就是你要做的。
git checkout -b test
git pull origin pull/939/head:test
现在,您可以在此本地测试分支(在本例中为test)中安全地测试更改,一旦满意,就可以照常从GitHub进行合并。
test
分支,然后拉入PR-这样一来,完成后就无需在本地还原分支;我只是处理工作树。实际上,我checkout -b
再也没有了-我总是创建一个工作树然后分支。磁盘便宜。当然,我有一个脚本可以做到这一点。我没有单独输入所有需要的命令。
您可以使用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
上面某些选项的问题在于,如果有人在打开PR后将更多提交提交到PR,他们将不会为您提供最新版本。对我来说,最有效的方法是-转到PR,然后按“提交”,滚动到底部以查看最新的提交哈希 ,然后简单地使用git checkout,即
git checkout <commit number>
在上面的例子中
git checkout 0ba1a50
git fetch origin pull/ID/head:BRANCHNAME
提到的方法完全解决了这个问题。感谢您的解决方案!
我正在使用集线器,它是来自github的工具: https //github.com/github/hub
使用集线器在本地检查拉取请求很容易:
hub checkout https://github.com/owner/repo/pull/1234
or
hub pr checkout 1234
对于Bitbucket,您需要将替换pull
为pull-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
然后,您可以使用任何答案的命令。
我无意间写了几乎和git-extras一样的东西。因此,如果您希望使用单个自定义命令而不是安装其他命令,只需将该git-pr
文件放在您的计算机中的某个位置$PATH
,然后就可以编写:
git pr 42
// or
git pr upstream 42
// or
git pr https://github.com/peerigon/phridge/pull/1
如果您遵循“ 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
假设您的来源和上游信息如下所示
$ 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>
应该做这份工作