git clone
默认只克隆github上面设置的默认分支,(如果没有修改,默认就是master分支),那如果需要把所有分支都克隆下来该怎么办呢?
我们最常用的克隆命令应该是这个: git clone
;
按照上面的理解,这个命令其实是下面命令的简写形式:git clone -b master
。
我们实际操作下:以我的第一个仓库hello-world为例:https://github.com/yansheng836/hello-world.git (注:因为我可能会用该仓库做一些测试,如果你也使用该仓库进行尝试,部分内容可能会和我的截图不一致)
思路:先查看远程分支,然后在本地创建和远程仓库同名的分支。
关键命令:git branch dev origin/dev
,即新建一个本地分支来跟踪远程的某一分支,创建该分支后,远程分支内容已拉取到本地分支。(或者你可以直接用git checkout -b dev origin/dev
,创建分支,并切换到该分支)
该方法弊端:因为这方法每次只创建一个分支,如果远程有多个分支,需要多次执行命令,比较麻烦。
该方法优点:(与下面方法进行对比)命令简单易懂。
如针对这个仓库你需要执行两次类似命令:
git branch readme origin/readme
git branch dev origin/dev
流程简单演示:
$ git clone https://github.com/yansheng836/hello-world.git
# 要先进入仓库目录
$ cd hello-world
$ git branch readme origin/readme
思路:在前面的分析已经提到了git clone url
是git clone -b master url
的缩写(假设没有在远程仓库修改默认分支),那么我们同样可以使用该命令下载其他分支的内容。
关键命令:git clone -b readme url
:下载该仓库的readme分支的内容。
优缺点:同方法1。
流程简单演示:
$ git clone https://github.com/yansheng836/hello-world.git
# 不用先进入仓库目录
$ git clone -b readme https://github.com/yansheng836/hello-world.git
思路:了解到了方法1、2的弊端,我们可能就会想到:循环可以执行重复的类似的操作,也许我们可以通过循环解决这个问题!该方法就是循环使用方法1.
背景说明:使用类Unix系统的人很自然就想到了使用shell编程,使用Windows系统人都是使用git的客户端的命令行工具,虽然可能种类不一,但是都是基于Linux shell的;因为git就是Linux的创始人:林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds) 开发的(开发git的初衷是因为和之前的版本管理系统的合作伙伴SCM(源码管理工具)闹掰了,这是个有趣的故事,详情可了解:Linux为什么开发Git?)。以此可以说:Linux和Git本是一家,所以Linux 很多命令也可以在git bash中使用;git火起来也正是因为Linus把庞大的 Linux内核代码库 (目前仓库大小为:2.55GB)放到git中进行版本管理(另一个重要原因是因为分布式),以实际行动证明Git完全有能力去管理这种庞大的系统。
关键命令:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done
命令简单解释:(Linux命令高手勿嘲笑,可跳过)
for xxx in xxxs; do xxx; done
是shell的for循环语句。git branch dev origin/dev
,–track参数是默认的,不加亦可。演示:
查看所有分支(包括本地和远程仓库分支)git branch --all
简写为git branch -a
After that,
git fetch --all
will update all local copies of remote branches.
Also,git pull --all
will update your local tracking branches, but depending on your local commits and how the ‘merge’ configure option is set it might create a merge commit, fast-forward or fail.
该方法弊端:(相对而言)命令比较复杂。
该方法优点:不管有多少分支都可以自动创建。
或者也可以这样:
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
流程简单演示:
$ git clone https://github.com/yansheng836/hello-world.git
# 要先进入仓库目录
$ cd hello-world
$ for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done
对于哪种方法比较好这个问题,需要你自己来回答!适合自己的才是合适的!
虽然我按照“分支数量多少来分”这种分类方式,但是这仅仅是我个人的推荐用法,没有什么正式的规则依据。
参考: