如何克隆特定的Git分支?

Scu*_*cud 2804 git git-clone git-branch

Git clone会将远程当前工作分支复制到本地.

有没有办法自己克隆一个特定的分支而无需在远程存储库上切换分支?

Jor*_*ona 7546

git clone -b <branch> <remote_repo>
Run Code Online (Sandbox Code Playgroud)

例:

git clone -b my-branch git@github.com:user/myproject.git
Run Code Online (Sandbox Code Playgroud)

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

git clone -b opencv-2.4 --single-branch https://github.com/Itseez/opencv.git
Run Code Online (Sandbox Code Playgroud)

  • pierr:我不确定这是否回答了上面给出的问题的描述,但它确实*回答了实际问题 - 如何克隆存储库的特定分支.我投了这个,因为这是我来到这个页面时谷歌搜索的答案. (522认同)
  • 这有效.它将新HEAD指向指定的分支而不是myproject中的HEAD-branch.但是,它仍然取出*all*分支.请参阅@ edmar-miyake的回答. (24认同)
  • thx为`--single-branch`; git 2.5在写这个时已经出来了.不关心旧版本. (9认同)
  • 如果在命令中添加--depth X,它将回答问题的描述.如果这样做,它将仅克隆指定的分支及其最后一个内容. (4认同)
  • @jorge为什么“-b”选项需要一个单独的“--single-branch”标志?单独使用“-b”可以克隆所有分支吗? (4认同)

Mic*_*ker 1055

请参阅许多人喜欢的其他答案.

与大多数愤怒的评论者和贬低者不同,您可能还想确保理解其中的差异.不同之处在于:通过调用--single-branch你获取所有分支并检出一个分支.例如,这可能意味着您的存储库具有5kB文档或wiki分支以及5GB数据分支.每当您想要编辑首页时,最终可能会克隆5GB的数据.

同样,这并不是说git clone --branch <branchname> url不是实现这一目标的方式,只是当你要求克隆一个特定的分支时,它并不总是你想要完成的.

我今天要写的答案,以及今天的git将是

git clone --single-branch --branch <branchname> <remote-repo>
Run Code Online (Sandbox Code Playgroud)

在撰写下面的原始答案时,git别无选择git clone --branch,但让我们保留它以让愤怒的蜜蜂完全满意.

copypasters如此严重不喜欢的答案是这样的:

git init
git remote add -t refspec remotename host:/dir.git
git fetch
Run Code Online (Sandbox Code Playgroud)

  • 通常,您还需要“--深度 1”,以便只获得最新的。这可以节省大量的下载时间。 (4认同)
  • @aderchox,不,它实际上会获取所有内容。它在更新时传输的内容非常智能,但是当您克隆大型存储库时,它实际上会提取历史记录,除非您明确告诉它不要这样做。但它仍然会获取树枝的尖端。`git fetch` 所不具备的——它不会检出文件,但这与传输无关。 (3认同)
  • 抱歉,您确定您所说的“您正在获取所有...”部分吗?我在某处读到 git fetch 实际上并不“复制”任何文件,它只是获取元数据和有关更改的信息。所以它的重量应该相对较轻......也许你已经从字面上使用了“fetch”这个词,而不是来自 git 词汇? (2认同)

sup*_*cal 262

这是一个非常简单的方法:)

克隆存储库

git clone <repository_url>
Run Code Online (Sandbox Code Playgroud)

列出所有分支

git branch -a 
Run Code Online (Sandbox Code Playgroud)

检查您想要的分支

git checkout <name_of_branch>
Run Code Online (Sandbox Code Playgroud)

  • 这是我的解决方案,因为我已经克隆了“master”。我不知道我可以简单地“结帐”一个远程分支。 (3认同)
  • 这可能是正确的做法;最佳实践 (2认同)
  • 很干脆的回答。您还需要做的另一件事是: 在这一步之后:“git checkout &lt;name_of_branch&gt;” 这样做: git branch --set-upstream-to=origin/&lt;branch&gt; &lt;local_branch&gt; 谢谢。 (2认同)

Edm*_*ake 245

要在获取其他分支的情况下克隆分支:

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH
Run Code Online (Sandbox Code Playgroud)

  • 工作,也只提取分支上的那些标签,这就是我想要的.(我实际上想要获取_multiple_分支,但只选择一些;为此,它足以重复`远程添加`和`checkout`这里,然后`git remote rm origin`来清理.) (2认同)
  • 完美地将git repo的特定标签合并到另一个项目中的完美解决方案。建议从git remote命令中省略-f,然后使用git fetch --depth = 1 $ BRANCH $ TAG,然后使用git checkout FETCH_HEAD。初始化是无害的,并且更改标签将自动更新签出的代码。 (2认同)

dki*_*zer 95

git checkout -b <branch-name> <origin/branch_name>
Run Code Online (Sandbox Code Playgroud)

例如在我的情况下:

 git branch -a
* master
  origin/HEAD
  origin/enum-account-number
  origin/master
  origin/rel_table_play
  origin/sugarfield_customer_number_show_c
Run Code Online (Sandbox Code Playgroud)

所以要根据我的enum-account-number分支创建一个新的分支,我做:

git checkout -b enum-account-number origin/enum-account-number
Run Code Online (Sandbox Code Playgroud)

点击返回后,会发生以下情况:

Branch enum-account-number set up to track remote branch refs/remotes/origin/enum-account-number.
Switched to a new branch "enum-account-number
Run Code Online (Sandbox Code Playgroud)

"

  • 请注意,首先'git pull origin`可能很有用,这样`git branch -a`可以列出所有新的(当前的)远程分支. (4认同)

Pla*_*own 27

使用该名称在本地系统上创建分支.比如说你想得到一个名为"branch-05142011"的分支

git branch branch-05142011 origin/branch-05142011

它会给你一条消息 - "Branch branch-05142011设置为从原点跟踪远程分支分支-05142011."

现在只需检查下面的分支,你就有了代码 -
git checkout branch-05142011

  • 这也会这样做:git fetch origin [remote-branch]:[new-local-branch] (5认同)
  • @PlanetUnknown感谢`git fetch origin [remote-branch]:[new-local-branch]`,我喜欢! (2认同)

小智 20

git --branch <branchname> <url>
Run Code Online (Sandbox Code Playgroud)

但是bash完成不会得到这个关键: --branch

请享用.