如何使用 git 查看 GitHub 拉取请求?
Posted
技术标签:
【中文标题】如何使用 git 查看 GitHub 拉取请求?【英文标题】:How can I check out a GitHub pull request with git? 【发布时间】:2015-02-18 11:53:42 【问题描述】:我想查看之前创建的拉取请求(通过 GitHub Web 界面创建)。我搜索并找到了 refs/pull 或 refs/pull/pr 的不同地方
但是当我将 fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
添加到 git 配置文件并执行 git fetch 时
我做错了什么? GitHub 应该自动创建 pull/xyz 的东西,还是我必须配置一些东西?
【问题讨论】:
配置文件的完整远程部分是什么样的? How can I fetch an unmerged pull request for a branch I don't own?的可能重复 github clone from pull request?的可能重复 我结束了这个问题,但我实际上需要***.com/q/1783405/2413303 第二段不是一个完整的句子。 “但是当我添加......并执行 git fetch” - 当您执行这些操作时会发生什么? 【参考方案1】:要将远程 PR 提取到本地存储库中,
git fetch origin pull/$ID/head:$BRANCHNAME
$ID
是拉取请求 ID,$BRANCHNAME
是您要创建的新分支的名称。创建分支后,只需
git checkout $BRANCHNAME
例如,假设您想从 origin 主分支签出 pull request #2:
git fetch origin pull/2/head:MASTER
请参阅official GitHub documentation 了解更多信息。
【讨论】:
我用它从上游仓库获取 pr 到我的本地分叉仓库,你也可以用上游替换原点。 我的命令最终看起来像git fetch origin pull/1/head:githubusername
,而不是我所期望的
@Antoine BRANCHNAME
是您想要命名的分支。我猜您尝试使用已经存在的名称(例如master
)并且不起作用,所以您尝试了您的用户名,它确实有效,因为他们没有使用该名称的分支。也许我误解了你在说什么。
这可能是您配置本地存储库的方式,origin
指向您的 fork,upstream
指向原始存储库(例如,在 help.github.com/articles/configuring-a-remote-for-a-fork 之后)。如果您想从原始仓库获取拉取请求,请确保在上述命令中将 origin
更改为 upstream
。
我试图获取在 ID 中包含“#”符号,如 GitHub 文档中突出显示的那样,如 pull/#1/head:branch
。只有数字必须输入,所以pull/1/head/branch
。【参考方案2】:
这将在您无需命名分支的情况下获取:
git pull origin pull/939/head
How do I get a specific pull request on my machine?
【讨论】:
请注意,例如,如果您在 master 分支上执行此操作,它将直接提交到此分支。如果您想将拉取请求带入单独的分支进行暂存,请尝试@timbo 的回答。 如果您稍后想将更改从拉取请求中拉取到本地分支中,这也适用。 我只是在找这个,因为我需要拉别人的代码来审查,我不想切换到新的分支【参考方案3】:我更喜欢在不创建本地分支的情况下获取和结帐并处于HEAD 分离状态。它允许我快速检查拉取请求,而不会用不必要的本地分支污染我的本地机器。
git fetch upstream pull/ID/head && git checkout FETCH_HEAD
ID
是拉取请求 ID,upstream
是创建原始拉取请求的位置(例如,它可能是 origin
)。
希望对你有帮助。
【讨论】:
我喜欢这个解决方案。好处之一是,如果 PR 更新了更多提交,那么您可以再次运行它,它会拉入新的提交。 投票!无需本地分支,可以轻松远程更新。 @JamesRao 谢谢,没有本地分支是最好的部分!【参考方案4】:That gist 确实描述了您执行 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'
issues 259 中列出了各种脚本来自动执行该任务。git-extras项目提出命令git-pr
(在PR 262中实现)
git-pr
(1) -- 在本地签出一个拉取请求
概要
git-pr <number> [<remote>]
git-pr clean
说明
根据 GitHub 拉取请求编号创建本地分支,然后切换到该分支。
要从中获取的遥控器的名称。默认为
origin
。示例
这会检查来自
origin
的拉取请求226
:
$ 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'
【讨论】:
我不知道git-extras
项目,感谢您提及! - 另请参阅此其他 SO 答案 How do I checkout a PR from a fork?,其中我提出了一个类似的命令 git prw
,该命令另外 设置上游分支(因此获得的分支不是“只读”分支)。
【参考方案5】:
如果您使用的是 Github.com,请转到“Pull requests”,点击相关的 pull request,然后点击“命令行说明”链接:
【讨论】:
说,实际上有没有一种方法——当你在看 github.com 时——我的意思是——下载 PR 的新/更改文件?因此,当您在 github 上查看 repo 时,您可以单击方便的“以 zip 格式下载”按钮,或者实际上,您可以非常简单地单击并查看项目的每个(整个)文件。对于 PR,我看不到如何简单地单击“查看文件”——知道我的意思吗?我错过了什么吗?干杯! @Fattie 是的。您只需单击自己进入贡献者的存储库(您可以选择其存储库的任何状态,最新或任何其他提交),然后使用 ↓ 代码 ➜ 下载 ZIP 功能在存储库的主页上。【参考方案6】:Github 最近发布了一个名为 github-cli 的 cli 实用程序。安装后,您可以使用其 id (doc) 在本地签出拉取请求的分支
例如:gh pr checkout 2267
这也适用于分叉,但如果您随后需要推回分叉,则需要添加远程存储库并使用传统的 git push
(直到这个 ticket 在 gh 实用程序中实现)
【讨论】:
【参考方案7】:参考 Steven Penny 的回答,最好创建一个测试分支并测试 PR。所以这就是你要做的。
-
创建一个测试分支以将 PR 合并到本地。假设你在 master 分支上:
git checkout -b test
-
将 PR 更改放入测试分支
git pull origin pull/939/head:test
现在,您可以在此本地测试分支(在本例中名为 test)安全地测试更改,一旦您满意,就可以像往常一样从 GitHub 合并它。
【讨论】:
我会做得更好——我会创建一个工作树,将其设置为一个新的test
分支,然后拉入 PR——这样我就不需要在本地恢复分支了完毕;我只是处理工作树。事实上,我不再只是 checkout -b
- 我总是创建一个工作树然后分支。磁盘便宜。当然,我有一个脚本可以做到这一点;我没有单独输入所有需要的命令。【参考方案8】:
上面一些选项的问题是,如果有人在打开 PR 后向 PR 推送了更多的提交,他们不会给你最新的版本。 对我来说最好的方法是 - 转到 PR,然后按“提交”,滚动到 底部 以查看最近的提交哈希 然后简单地使用 git checkout,即
git checkout <commit number>
在上面的例子中
git checkout 0ba1a50
【讨论】:
我用***.com/a/30584951/659732 中提到的git fetch origin pull/ID/head:BRANCHNAME
方法正好遇到了这个问题。感谢您的解决方案!【参考方案9】:
对于 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
然后您可以使用任何答案的命令。
【讨论】:
【参考方案10】:您可以使用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
【讨论】:
【参考方案11】:如果您遵循“github fork”工作流程,您可以在其中创建一个 fork 并添加远程上游 repo:
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
【讨论】:
【参考方案12】:我正在使用集线器,一个来自 github 的工具:https://github.com/github/hub
使用集线器在本地签出拉取请求有点容易:
hub checkout https://github.com/owner/repo/pull/1234
or
hub pr checkout 1234
【讨论】:
【参考方案13】:我不小心写出了与 git-extras 提供的几乎相同的内容。因此,如果您更喜欢单个自定义命令而不是安装一堆其他额外命令,只需将 this git-pr
file 放在 $PATH
的某个位置,然后您就可以编写:
git pr 42
// or
git pr upstream 42
// or
git pr https://github.com/peerigon/phridge/pull/1
【讨论】:
【参考方案14】:获取远程 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
【讨论】:
这应该注意,在 Github 上,您实际上无法编辑 PR 并将其推回。远程 refs/pull/ 命名空间是read-only。【参考方案15】:使用较新版本的 Git:
git fetch origin refs/pull-requests/<id>/from:<localbranchname>
【讨论】:
【参考方案16】:假设您的来源和上游信息如下所示
$ 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>
应该做的事
【讨论】:
分享代码时,请尽量解释您的代码【参考方案17】:检查 PR 并查看该 PR 的所有更改,与 VSCode 中的主分支相比。类似于 Github PR 页面的files changed
部分。
结帐 PR (100) 处于“分离 HEAD”状态git fetch origin pull/100/head && git checkout FETCH_HEAD
显示为未提交的更改git reset main
切换回主分支并进行这些更改git switch -
【讨论】:
【参考方案18】:要快速检查本地 PR,请打开它并检查创建 PR 的分支名称。
正如我们在上面的红线中看到的分支名称是'CLUPET-173-glrr-apis' 使用以下命令快速查看 PR/Branch 中的代码
git checkout origin/CLUPET-173-glrr-apis
现在您本地的这段代码将以分离头模式运行。
停止所有 PR 代码查看并返回您之前的分支
git switch -
如果您想将 PR(以及您在获取 PR 后所做的任何新的本地更改)移动到新的本地分支,请使用以下命令
git switch -c myNewLocalBranch
【讨论】:
【参考方案19】:使用 git-cli 有一种简单的方法
gh pr checkout <number> | <url> | <branch>
参考:https://cli.github.com/manual/gh_pr_checkout
【讨论】:
这个答案与 bagerard 的有什么不同?【参考方案20】:创建本地分支
git checkout -b local-branch-name
拉远程PR
git pull git@github.com:your-repo-ssh.git remote-branch-name
【讨论】:
以上是关于如何使用 git 查看 GitHub 拉取请求?的主要内容,如果未能解决你的问题,请参考以下文章