从拉取请求中克隆GitHub?

199

我想从GitHub克隆一个仓库,但问题是我不想要主分支;我想要这个未批准的拉取请求中的版本。

我能否克隆拉取请求版本而不是主仓库?


3
如果你来这里不是为了clone而是为了fetch,请参考:https://dev59.com/Omw15IYBdhLWcg3wO5SX - Ciro Santilli OurBigBook.com
13个回答

183
最简单的方法就是这样做:
git fetch origin pull/<pr_number>/head:<local_branch_name>
git switch <local_branch_name>

你现在将进入一个位于拉取请求状态的新分支。
你可能想通过运行以下命令来设置一个别名:
git config --global alias.pr '!f() { git fetch -fu ${2:-origin} refs/pull/$1/head:pr/$1 && git checkout pr/$1; }; f'

现在你可以通过运行git pr <pr_number>来检查任何PR,或者如果你的github远程不是命名为origin,则可以运行git pr <pr_number> <remote>

65
更好的写法:git fetch origin pull/<#>/head:<local_branch_name> (引自:https://coderwall.com/p/z5rkga) - schlamar
9
我发现自己经常参考这个SO答案,所以我把它贴到了我的.gitconfig文件下的[alias]里:pr = "!f() { git fetch $1 pull/$2/head:pull_$2; git co pull_$2; }; f"。通过这种方式,我只需要键入git pr upstream 62,下一刻我就会在来自upstream的第62个PR的新分支上了!如果你总是使用origin,你可以将其硬编码代替$1`,但对于我而言这样切换比较麻烦。 - matt---
1
@matt 假设您有一个名为 co 的别名用于检出。 - giraffesyo
在pull/2/head中,2代表什么? - undefined
@Jayanth 提交请求的编号。 - undefined
显示剩余4条评论

114

你可以使用-b选项克隆你想要的分支,对于拉取请求:

git clone https://github.com/user_name/repo_name.git -b feature/pull_request_name dir_name

在您的情况下,您想要克隆的分支是拉取请求的源分支(feature/mongoose-support):

git clone https://github.com/berstend/frappe.git -b feature/mongoose-support ./mongoose-support

55
git fetch origin refs/pull/PR_NUMBER/head:NEW_LOCAL_BRANCH

例如:

git fetch origin pull/611/head:pull_611
git checkout pull_611

进行更改,提交它们,PUSH并从您在GitHub上的分支中打开新的PR


我该如何在本地合并这些分支?就像你之前所做的那样,我刚刚克隆和获取了一个未合并的拉取请求。我尝试了checkout branchname,但是我的IDE/文本编辑器中没有任何更改出现。 - erginduran

20

4
注意:git pull会将其他分支合并到当前分支,通常在进行Pull Request(PR)时,您只需使用git fetch来获取原作者的代码(它可以作为FETCH_HEAD访问)。如果您确实想要合并,请注意提及pull/2/merge(而不是pull/2/head)-这会使GitHub向您提供一个精确的合并提交,就像您现在单击[合并]按钮一样。 - Beni Cherniavsky-Paskin

18
您可以按照此处的说明进行操作,以便能够直接检出远程代码库,而无需找到其存储库和分支。 使用示例 对于我的一个项目(github3.py),我在我的github3.py/.git/config文件中有以下内容。
[remote "github"]
    fetch = +refs/heads/*:refs/remotes/github/*
    fetch = +refs/pull/*/head:refs/remotes/github/pr/*
    url = git@github.com:sigmavirus24/github3.py

第一行是每个远程都标准的内容,但github被替换为远程的名称。这意味着远程头(或该服务器上分支的头)被“映射”到以github/为前缀的本地远程。因此,如果我执行git fetch github并且GitHub上有一个分支在我的机器上尚未被注意到,它将下载该分支,然后我可以这样切换到它:git checkout -t github/branch_name

第二行做的也是同样的事情,但它是针对拉取请求而不是标准的git分支。这就是为什么你看到refs/pull/*/head。它获取GitHub上每个拉取请求的头,并将其映射到github/pr/#。因此,如果有人发送了一个拉取请求,编号为62(例如),那么您需要执行:

git fetch github
git checkout -t github/pr/62

假设还未存在名为 pr/62 的本地分支,那么你现在就在这个本地分支上了。这样做很好,因为你不必跟踪其他人的远程仓库或分支。


2
为什么不呢?它以一种方便高效的方式准确地解释了如何做到这一点。 - Ian Stapleton Cordasco
因为我是个新手,而且那份文档很难理解。如果没有那份要点文档,我永远也不会从“不懂”到git clone https://github.com/berstend/frappe.git -b feature/mongoose-support /my_clone - Fresheyeball
6
Gist文档的作用是在GitHub上添加额外的信息(引用或参考资料)以获取。当你执行 git fetch github 命令后,就可以使用 git co -t github/pr/# 命令了。这样做可以避免复制粘贴远程URL、查找分支名称等繁琐步骤。你会获得简洁准确的分支名称,而不必再费力处理这些问题。但我知道这可能会让你感到压力很大。 - Ian Stapleton Cordasco
哦,太好了。我不知道这个 +1!你能给我一个完全限定的例子吗? - Fresheyeball
@sigmavirus24非常感谢您提供的信息;我想知道是否有类似的技巧适用于Bitbucket? - Petr Kozelka
@PetrKozelka 我不知道有没有针对 Git 的,但我知道 Mercurial 会自动处理。 - Ian Stapleton Cordasco

7
当用户提交一个拉取请求时,他们要求将分支上的某些更改从其克隆的分叉合并回另一个用户的存储库。
您可以从拉取请求的源获取所需的更改。为此,请克隆用户的存储库(git://github.com/berstend/frappe.git),然后检出他创建拉取请求的分支(feature/mongoose-support)。

5

要将PR拉到您当前的分支,请使用:

git pull origin pull/418/head

这里的 pull/{PR编号}/head

进入图像描述


5

3

对我来说,这很简单

git fetch origin pull/4/head

找到了这里的4:

输入图像描述


无法使用git clone命令工作。 - Soylent Graham

1
安装完git-extras之后:
(cd /tmp && git clone --depth 1 https://github.com/tj/git-extras.git && cd git-extras && sudo make install)

你可以简单地使用git pr
$ git pr 62 [remote]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接