【问题标题】:How do I clone a specific Git branch? [duplicate]如何克隆特定的 Git 分支? [复制]
【发布时间】:2010-12-27 00:51:04
【问题描述】:

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

有没有什么方法可以自己克隆一个特定的分支,而不需要在远程仓库切换分支?

【问题讨论】:

    标签: git git-branch git-clone


    【解决方案1】:
    git clone --single-branch --branch <branchname> <remote-repo>
    

    --single-branch 选项从 1.7.10 及更高版本开始有效。

    另请参阅许多人喜欢的other answer

    您可能还想确保您了解其中的区别。不同之处在于:通过调用git clone --branch &lt;branchname&gt; url,您将获取所有 分支并签出一个。例如,这可能意味着您的存储库有一个 5kB 的文档或 wiki 分支和 5GB 的数据分支。每当您想编辑您的首页时,您最终可能会克隆 5GB 的数据。

    再次重申,这并不是说 git clone --branch 不是实现这一目标的方法,只是当您询问克隆特定分支时,它并非总是您想要完成的目标.

    【讨论】:

    • 评论不用于扩展讨论;这个对话是moved to chat
    • 对不起,您确定您所说的“您正在获取所有...”的部分吗?我在某处读到 git fetch 实际上并没有“复制”任何文件,它只是获取元数据和有关更改的信息。所以它应该是相对轻量级的......也许你从字面上使用了“fetch”这个词,而不是来自 git 词汇表?
    • @aderchox,不,它实际上会获取所有内容。它在更新时传输的内容非常聪明,但是当您克隆一个大存储库时,它实际上会提取历史记录,除非您明确告诉它不要这样做。但它仍然会获取分支的尖端。 git fetch 没有 - 它不签出文件,但这与传输无关。
    • 通常您还需要--depth 1,以便您只获得最新的。这样可以节省大量的下载时间。
    【解决方案2】:
    git --branch <branchname> <url>
    

    但是 bash 完成没有得到这个密钥:--branch

    【讨论】:

      【解决方案3】:

      使用该名称在本地系统上创建一个分支。例如说你想得到名为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
      

      【讨论】:

      • 这也可以:git fetch origin [remote-branch]:[new-local-branch]
      • 说得对。 Miyake(下)展示了添加遥控器时的操作方法。
      • 应该说,“PlanetUnknown 说得对。”
      • @PlanetUnknown 感谢git fetch origin [remote-branch]:[new-local-branch],我喜欢!
      • git fetch origin [remote-branch]:[new-local-branch] for the win
      【解决方案4】:
      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
      

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

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

      【讨论】:

      • 请注意,首先git pull origin 可能很有用,以便git branch -a 可以列出所有新的(当前)远程分支。
      • 好点。不过,git fetch 可能会更好,这样就不会发生自动合并。
      【解决方案5】:
      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
      

      【讨论】:

      • pierr:我不确定这是否回答了上述问题的描述,但它确实回答了实际问题 - 如何克隆存储库的特定分支.我对此投了赞成票,因为这是我在访问此页面时在谷歌上搜索的答案。
      • 这行得通。它将新 HEAD 指向指定的分支,而不是 myproject 中的 HEAD-branch。但是,它仍然会获取 all 分支。请参阅@edmar-miyake 的回答。
      • 如果您在命令中添加 --depth X,它将回答问题的描述。如果这样做,它将只克隆指定的分支及其最后的内容。
      • 感谢--single-branch;撰写本文时,git 2.5 已经发布。不关心旧版本。
      • @jorge 为什么-b 选项需要单独的--single-branch 标志? -b 单独克隆所有分支吗?
      【解决方案6】:

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

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

      【讨论】:

      • 很好的解决方案。在较旧的 git(我有 1.5.5.6)上,结帐前可能需要一个 git branch --track $BRANCH origin/$BRANCH。
      • 有效,并且只获取分支上存在的那些标签,这正是我想要的。 (我实际上想获取 multiple 分支,但只获取选定的分支;为此,重复remote addcheckout 就足够了,然后git remote rm origin 进行清理。)
      • 在另一个项目中浅层合并 git repo 的特定标签的完美解决方案。建议在 git 远程命令中省略 -f,然后使用 git fetch --depth=1 $BRANCH $TAG,然后使用 git checkout FETCH_HEAD。 init 是无害的,更改标签会自动更新签出的代码。
      • 与 Michael Krelin 的(3 步)答案不同,这个答案实际上对我有用(git 1.7.9.5)
      • 多次失败后,这段代码对我有用..git version 2.9.2
      【解决方案7】:

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

      克隆存储库

      git clone <repository_url>
      

      列出所有分支

      git branch -a 
      

      签出你想要的分支

      git checkout <name_of_branch>
      

      【讨论】:

      • 这将工作目录切换到正确的分支,但我无法推送我所做的任何更改,因为我不是“当前在分支上”。
      • 这是我的解决方案,因为我已经克隆了“master”。我不知道我可以简单地“签出”远程分支。
      • 这可能是正确的做法;最佳实践
      • 这种方式不会只克隆选择的分支。这个答案似乎更好:stackoverflow.com/a/7349740/3075243。例如,如果一个 repo 有许多足够大的分支,我们不想克隆每个分支。
      • 非常清晰的答案。您还需要做的另一件事是:在此步骤之后:“git checkout ”执行此操作:git branch --set-upstream-to=origin/ 谢谢。
      猜你喜欢
      • 1970-01-01
      • 2015-07-10
      • 2020-09-27
      • 1970-01-01
      • 2012-04-03
      • 2013-01-24
      • 2017-05-05
      • 2021-06-26
      相关资源
      最近更新 更多