如何克隆特定的Git分支?

3960

Git clone将远程分支克隆到本地。

有没有办法在不切换远程仓库的分支的情况下,自己克隆特定的分支?

7个回答

8842
git clone -b <branch> <remote_repo>

示例:

git clone -b my-branch git@github.com:user/myproject.git

使用Git 1.7.10及更高版本,添加--single-branch以防止获取所有分支。例如,使用OpenCV 2.4分支:

git clone -b opencv-2.4 --single-branch https://github.com/Itseez/opencv.git

581
我不确定这是否回答了上面所描述的问题,但它确实回答了实际的问题——如何克隆存储库的特定分支。我投票支持这个答案,因为当我来到这个页面时,这正是我要搜索的答案。 - Jaime Bellmyer
29
这个方法有效。它将新的HEAD指向指定的分支而不是myproject中的HEAD-branch。但是,它仍会获取所有分支。请参见@edmar-miyake的回答。 - cdunn2001
4
如果你在命令中添加 --depth X,它就能够满足所描述的问题。这样做会仅克隆指定分支及其最新内容。请注意,不要更改原始含义。 - ramsvidor
9
感谢使用--single-branch命令;在撰写本文时,Git 2.5已经发布。不用关心旧版本。 - Bernhard Döbler
4
为什么使用“-b”选项时需要单独使用“--single-branch”标志?仅使用“-b”会克隆所有分支吗? - CᴴᴀZ
显示剩余9条评论

2444
git clone --single-branch --branch <branchname> <remote-repo>

--single-branch选项适用于版本1.7.10及以上版本。

请参见另一个答案,许多人更喜欢使用该答案。

您可能还想确保了解区别。区别在于:通过调用git clone --branch <branchname> url,您正在获取所有分支并检出其中一个。这可能意味着您的存储库具有5kB文档或wiki分支和5GB数据分支。每当您想要编辑首页页面时,您可能会克隆5GB的数据。

再次强调,并不是说git clone --branch不能完成此操作,只是当您询问克隆特定分支时,它并不总是您想要实现的方式。


评论不适合进行长时间的讨论;此对话已被移至聊天室 - Jean-François Fabre
2
请问您确定所说的“你正在获取所有...”这部分吗?我在某个地方读到,git fetch 实际上并不会“复制”任何文件,它只是获取有关更改的元数据和信息。因此,它应该相对轻量级...也许您使用了“fetch”的字面意思,而不是 git 词汇表中的含义? - aderchox
3
@aderchox,不,实际上它会获取所有的内容。它在更新时会在传输方面变得非常智能,但是当你克隆一个大型仓库时,它实际上会拉取历史记录,除非你明确告诉它不要这样做。但它仍然会获取分支的最新版本。git fetch 不会检出文件,但这与传输无关。 - Michael Krelin - hacker
8
通常你也会希望加上 --depth 1 这个参数,这样你只会得到最新的版本,从而节省大量下载时间。 - Eyal
git clone -b branch_name --single-branch 'repo_url' - Aditya Rajgor

353

以下是一种非常简单的方法 :)

克隆该存储库

git clone <repository_url>
列出所有分支。
git branch -a 

检出您想要的分支

git checkout <name_of_branch>

6
对我来说,这是解决方案,因为我已经克隆了“master”分支。我不知道我可以简单地“checkout”远程分支。 - yazzer
2
这可能是正确的做法;从最佳实践的角度来看。 - aaiezza
1
这种方式不仅克隆所选的分支。这个答案似乎更好:https://dev59.com/JnI-5IYBdhLWcg3wVWti#7349740。例如,如果一个仓库有许多足够大的分支,我们不想克隆每一个。 - Proustibat
5
非常简明的答案。你需要做的另一件事是:在执行这个步骤后:"git checkout <name_of_branch>"执行以下操作:git branch --set-upstream-to=origin/<branch> <local_branch>谢谢。 - ArunDhwaj IIITH
1
如果有人在Github上创建了新的分支,如何获取它? - vikramvi
显示剩余5条评论

265

要克隆一个分支而不获取其他分支:

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

1
好的解决方案。在旧版的git(我使用的是1.5.5.6),在checkout之前可能需要执行git branch --track $BRANCH origin/$BRANCH。 - Johannes Thoma
2
可以工作,并且只获取分支上存在的那些标签,这正是我想要的。 (实际上,我想获取多个分支,但仅选择其中一些;为此,重复使用remote addcheckout就足够了,然后使用git remote rm origin进行清理。) - Jesse Glick
2
浅层次地将 Git 存储库的特定标签混合到另一个项目中的完美解决方案。建议从 git 远程命令中省略 -f,然后使用 git fetch --depth=1 $BRANCH $TAG,然后使用 git checkout FETCH_HEAD。初始化是无害的,更改标签将自动更新已检出的代码。 - taranaki
与Michael Krelin的(3步)答案不同,这个对我实际起作用了(git 1.7.9.5)。 - Bobby Jack
经过多次尝试,这段代码终于对我起作用了.. git版本2.9.2 - Budi Mulyo

139

使用:

git checkout -b <branch-name> <origin/branch_name>
例如在我的情况下:
 git branch -a
* master
  origin/HEAD
  origin/enum-account-number
  origin/master
  origin/rel_table_play
  origin/sugarfield_customer_number_show_c

要基于我的enum-account-number分支创建一个新分支,我需要执行以下操作:

git checkout -b enum-account-number origin/enum-account-number

按下Return键后,会发生以下情况:

Branch enum-account-number set up to track remote branch refs/remotes/origin/enum-account-number.
Switched to a new branch "enum-account-number"

4
注意,先执行 git pull origin 可能很有用,这样 git branch -a 就可以列出所有新的(当前的)远程分支。 - André Caron
1
好主意。也许最好使用 git fetch,这样就不会自动合并了。 - dkinzer
这个解决方案对于创建一个新的本地分支、切换到它并设置跟踪相应的远程分支非常有帮助。 - Nissal

39

在本地系统上创建一个与该名称相同的分支。例如,假设您想获取名为branch-05142011的分支。

git branch branch-05142011 origin/branch-05142011

它会给你一个消息:

$ git checkout --track origin/branch-05142011
Branch branch-05142011 set up to track remote branch refs/remotes/origin/branch-05142011.
Switched to a new branch "branch-05142011"

现在只需像下面这样检出分支,你就有了代码

git checkout branch-05142011

7
这也可以: git fetch origin [远程分支]:[新本地分支] - PlanetUnknown
它是正确的。Miyake(以下)展示了添加远程时如何执行。 - cdunn2001
应该这样说,“PlanetUnknown是正确的。” - cdunn2001
3
谢谢@PlanetUnknown,我喜欢git fetch origin [remote-branch]:[new-local-branch] - Jeaf Gilbert
git fetch origin [remote-branch]:[new-local-branch] 赢了 - miked
1
我尝试了 git branch ue5-early-access origin/ue5-early-access,但出现错误:"fatal: Not a valid object name: 'origin/ue5-early-access'.",有什么提示吗? - Aquarius Power

34
git --branch <branchname> <url>

但是Bash自动完成功能无法识别这个键:--branch


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