如何使用 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 &lt;commit number&gt;

在上面的例子中

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/&lt;id&gt;/from:&lt;localbranchname&gt;

【讨论】:

【参考方案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 &amp;&amp; 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 拉取请求?的主要内容,如果未能解决你的问题,请参考以下文章

git如何从github拉取更新代码

如何为 lint 和运行测试的拉取请求编写管道

Git学习01-提交代码,查看日志,回退,穿梭,撤销Github仓库代码的删除和拉取等

如何使用 EGit 发出拉取请求?

如何在 GitHub 上恢复拉取请求提交

vsCode如何从github拉取项目