我如何用git检查GitHub拉请求?

我想检查之前创建的拉请求(通过GitHub web界面创建)。我搜索了一下,发现不同的地方有裁判/拉或裁判/拉/pr

但当我添加fetch = +refs/pull/*/head:refs/remotes/origin/pr/*到git配置文件,并做一个git获取

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

267244 次浏览

这一要点描述了当你获取git时发生了什么:

显然,改变github的url,以匹配你的项目的url。结果是这样的:

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

注意fetch refspecs的顺序,正如crashneb在他的自己的答案中所建议的那样。

如果不是,意思是如果你没有正确的顺序,因为:

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

,然后相信PR-checkout会自然地用git switch pr/1之类的东西设置新的本地分支——那么如果PR更新了,而你想再次git pull它,你可能会遇到麻烦。
branch.pr/1.merge配置值将不正确


现在获取所有的pull请求:

$ 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-extras项目提出命令git-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'

要获取远程PR到本地回购,

git fetch origin pull/$ID/head:$BRANCHNAME

其中$ID是拉请求id, $BRANCHNAME是你想要创建的新分支的名称。一旦您创建了分支,那么简单

git checkout $BRANCHNAME

例如,让我们想象一下,你想从源主分支签出拉请求#2:

git fetch origin pull/2/head:MASTER

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

这将在你不需要命名分支的情况下获取:

git pull origin pull/939/head

我如何在我的机器上得到一个特定的拉请求?< / >

我不小心写了和git-extras提供的几乎一样的东西。因此,如果你更喜欢一个自定义命令,而不是安装一堆其他额外的命令,只需将这个git-pr文件放在你的$PATH中的某个地方,然后你可以这样写:

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

如果你使用Github.com,去“拉请求”,点击相关的拉请求,然后点击“命令行指令”链接: 命令行指令在Github.com < / p >

上面的一些选项的问题是,如果有人在打开PR后推送更多的提交,他们不会给你最新的版本。 对我来说,最有效的方法是-转到PR,并按“提交”,滚动到以查看最近的提交哈希 enter image description here 然后简单地使用git签出,即

git checkout <commit number>

在上面的例子中

git checkout 0ba1a50

参考Steven Penny的回答,最好创建一个测试分支并测试PR。

  1. 创建一个测试分支,将PR合并到本地。假设你在主分支上:

git checkout -b test

  1. 让PR变更进入测试分支

git pull origin pull/939/head:test

现在,您可以安全地在这个本地测试分支上测试更改(在本例中,命名为测验),一旦您满意,就可以像往常一样从GitHub合并它。

你可以使用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

我更喜欢获取和签出不需要创建本地分支,并在HEAD分离状态。它允许我快速检查拉取请求,而不会用不必要的本地分支污染本地机器。

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

其中ID是一个拉请求ID,而upstream是已经创建的原始拉请求(例如,它可以是origin)。

我希望这能有所帮助。

如果你遵循“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

对于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

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

我正在使用hub,一个来自github: https://github.com/github/hub的工具

使用hub在本地检出一个pull请求有点容易:

hub checkout https://github.com/owner/repo/pull/1234
or
hub pr checkout 1234

将远程公关分支机构导入本地分支机构:

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

假设你的起源和上游信息如下所示

   $ 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>

应该做这项工作

Github最近发布了一个名为github-cli的cli实用程序。在安装它之后,你可以通过使用它的id (医生)在本地签出一个拉请求的分支。

例句:gh pr checkout 2267

这也适用于fork,但如果你需要回推到fork,你将需要添加远程存储库并使用传统的git push(直到这个在gh实用程序中实现)

有一种使用git-cli的简单方法

gh pr checkout {<number> | <url> | <branch>}

参考:https://cli.github.com/manual/gh_pr_checkout

创建本地分支

git checkout -b local-branch-name

拉遥控器PR

git pull git@github.com:your-repo-ssh.git remote-branch-name

将PR和看到所有的变化从那个PR与VSCode中的主分支进行比较。类似于Github PR页面的files changed部分。

  1. checkout PR (100) in 'detached HEAD' state
    git fetch origin pull/100/head && git checkout FETCH_HEAD < / p >

  2. 显示为未提交的更改
    git reset main < / p >

  3. 切换回主分支并携带这些更改
    git switch - < / p >

在更新版本的Git中:

git fetch origin refs/pull-requests/<id>/from:<localbranchname>

要快速检查本地的PR,请打开它并检查从中创建PR的分支名称。

enter image description here 正如我们在上面的红线中看到的,分支的名称是'CLUPET-173-glrr-apis' 使用以下命令快速查看PR/Branch

中的代码
git checkout origin/CLUPET-173-glrr-apis

现在这段代码在您的本地将运行为分离头模式。

停止所有PR代码查看和回到你的前一个分支

git switch -

如果你想移动PR(加上你在获取PR后所做的任何新的本地更改)到一个新的本地分支,使用下面的命令

git switch -c myNewLocalBranch

虽然这个线程上的大多数答案都可以工作,但我更喜欢选择拉请求更改,这允许我测试以及查看我的IDE中的差异。

git checkout <newbranch>
git fetch origin pull/<pullrequestId>/head && git cherry-pick FETCH_HEAD

git checkout test-pr
git fetch origin pull/34/head && git cherry-pick FETCH_HEAD

运行上述命令将提取PR的更改,并在您的IDE版本中显示它们,它们不会被提交,您可以看到差异,就好像这些更改是在本地进行的一样。