几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
Git 分支实际上是指向更改快照的指针。
有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。
在Git里,刚开始就有的这个分支叫主分支,即master
分支。HEAD
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,HEAD
指向的就是当前分支。
一开始的时候,master
分支是一条线,Git用master
指向最新的提交,再用HEAD
指向master
,就能确定当前分支,以及当前分支的提交点。每次提交,master
分支都会向前移动一步,这样,随着不断提交,master
分支的线也越来越长。
当我们创建新的分支,例如dev
时,Git新建了一个指针叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示当前分支在dev
上
你看,Git创建一个分支很快,因为除了增加一个dev
指针,改改HEAD
的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev
分支了,比如新提交一次后,dev
指针往前移动一步,而master
指针不变:
假如我们在dev
上的工作完成了,就可以把dev
合并到master
上。Git怎么合并呢?最简单的方法,就是直接把master
指向dev
的当前提交,就完成了合并:
所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除dev
分支。删除dev
分支就是把dev
指针给删掉,删掉后,我们就剩下了一条master
分支:
分支操作
命令 | 说明 | 备注 |
---|---|---|
git branch | 查看分支 | |
git branch (branchname) | 创建分支 | |
git checkout (branchname) 或者 git switch (branchname) | 切换分支 | 当切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录 |
git merge (branchname) | 合并某分支到当前分支 | 可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支 |
git checkout -b (branchname) 或者git switch -c (branchname) | 创建+切换分支 | |
git branch -d (branchname) | 删除分支 |
实战
开始前我们先创建一个测试目录:
$ mkdir keduo
$ cd keduo
$ git init
已初始化空的 Git 仓库于 /home/ubuntu/keduo/.git/
$ touch README
$ git add README
$ git commit -m '第一次版本提交'
[master (根提交) f7295fb] 第一次版本提交
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README
- 列出本地的分支
$ git branch
* master
- 创建
dev
分支,然后切换到dev
分支
$ git checkout -b dev
切换到一个新分支 'dev'
$ git branch
* dev
master
git branch
命令会列出所有分支,当前分支前面会标一个*
号
-
然后,在
dev
分支上正常提交,比如添加test.txt
,并加上一行:csdn@keduo
然后提交:
$ echo 'csdn@keduo' > text.txt $ git add . $ git commit -m 'add test.txt' [dev 405fb58] add text.txt 1 file changed, 1 insertion(+) create mode 100644 text.txt
命令解析:
echo 'csdn@keduo' > text.txt
表示向文件text.txt
写入文本csdn@keduo
-
dev
分支的工作完成,切换回master
分支:$ ls README text.txt $ git checkout master 切换到分支 'master' $ ls README
切换回
master
分支后,再查看一下text.txt
文件,文件不见了!因为那个提交是在dev
分支上,而master
分支此刻的提交点并没有变: -
把
dev
分支的工作成果合并到master
分支上:$ git merge dev 更新 f7295fb..405fb58 Fast-forward text.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 text.txt
注意到上面的
Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。但不是每次合并都能
Fast-forward
,后面会讲其他方式的合并$ ls README text.txt $ cat text.txt csdn@keduo
合并后,再查看
text.txt
的内容,就可以看到,和dev
分支的最新提交是完全一样的。 -
合并完成后,删除
dev
分支$ git branch dev * master $ git branch -d dev 已删除分支 dev(曾为 405fb58)。 $ git branch * master
删除后,查看
branch
,就只剩下master
分支了因为创建、合并和删除分支非常快,所以Git鼓励使用分支完成某个任务,合并后再删掉分支,这和直接在
master
分支上工作效果是一样的,但过程更安全。