一般情况下我们的git仓库会有多个分支,主分支就是master
,在我看来大多数时候其余分支是用于保护主分支不被无意破坏。
1,什么是分支
我们知道,git每执行一次commit
命令,就会把当前文件状态保存为快照存在仓库中。
分支就是为了将修改记录的整体流程分叉保存,每个分支不受其他分支的影响。
例如某个仓库进行了3次commit
操作,可能如下图所示:
图中黑色矩形框代表我们每一次进行的commit
生成的快照,蓝色圆角矩形框代表分支,紫色椭圆框代表头指针。
可见这个仓库只有一个master
分支,头指针指向我们当前正在操作的分支。
2,新建分支
有两个命令实现新建分支。
新建分支但仍然使用当前分支:
git branch 新分支名
新建分支并切换到新分支:
git checkout -b 新分支名
例如新建分支dev
:
git branch dev
那么上述仓库就会变成这样:
新分支一般会以当前最新快照为起点建立。
3,切换分支
上述的checkout -b 分支名
可以直接新建分支并切换至新分支,当然直接切换分支也很简单:
git checkout 分支名
使用checkout
命令即可。
还是上述仓库,切换到dev
分支:
这样当前分支切换到了dev
。
接下来我们进行开发并做了一次提交,又会变成什么样呢?如下图:
4,融合分支
可以使用下列命令将指定分支融合至当前分支:
git merge 指定融合分支
我们在dev
分支开发完毕了一个版本,想将其融合到master
,那就先切换至master
分支再使用merge
命令进行融合:
git checkout master git merge dev
上述仓库融合后如下:
假设你的仓库有对应的远程仓库,将dev
融合到master
之后,还需要将master
也推送上去哦!
git push xxx master
xxx
表示你的远程仓库别名。
5,查看当前仓库分支
这个就简单了。
查看当前仓库本地分支:
git branch
查看当前仓库远程分支:
git branch -r
查看当前仓库所有分支(本地+远程):
git branch -a
6,将本地分支和远程分支建立追踪关系
我们git clone
下来的仓库默认只克隆了其中的master
分支。不过要对远程仓库已有的dev
分支进行开发怎么办呢?方法其实很多,下面来一一说明。
(1) 克隆时指定分支
git clone
命令后面加上-b
参数指定分支即可,例如克隆某仓库dev
分支:
git clone -b dev 仓库地址
(2) 新建本地分支dev
并和远程仓库的dev
分支建立追踪关系
例如我刚克隆下来的一个仓库,首先查看所有分支:
git branch -a
可见本地只有一个master
分支,但是远程分支除了master
还有一个dev
分支。
通过git branch
命令新建本地dev
分支并和远程dev
分支建立追踪关系:
git branch dev git branch --set-upstream-to=remotes/origin/dev dev
重点是这个命令将本地分支和远程分支建立追踪关系:
git branch --set-upstream-to=远程分支名 本地分支名
然后再使用checkout
命令切换至dev
分支即可开始开发,然后git push xxx dev
将dev
分支变动提交至远程仓库,xxx
更换为自己的仓库别名。
其实还有一个更加简单的方法,使用checkout
命令即可新建一个本地分支并切换至新建的分支,同时将这个分支和指定远程分支建立追踪关系:
git checkout -b 本地分支名 远程分支名
例如上述仓库一克隆下来我们其实只要执行这一句:
git checkout -b dev remotes/origin/dev
这个命令会直接实现在本地建立了dev
分支并切换上去,并和远程dev
分支建立追踪关系,一步到位。
可见git branch --set-upstream-to=
命令用于手动建立现有本地分支和远程分支追踪关系,而git checkout -b
命令则是新建、切换、追踪一步到位。这两个命令大家视情况使用。
还有一种情况是,本地新建了一个dev
分支,但是远程仓库没有这个dev
分支,怎么办呢?其实直接把dev
分支push
上去即可,本地推送的分支若远程仓库中不存在,远程仓库会自动创建。
7,删除分支
删除分支其实很简单,不过是很危险的操作,请谨慎使用!
删除本地分支:
git branch -d 分支名
删除远程分支:
git branch -dr 远程分支名