概要
Git
实现版本控制的一个重要基础是其Git
的分支
功能,分支
本质上是一个指针,它指向某个版本,当有新的版本提交时,只需移动该指针到最新的版本即可,同时记录该指针的移动轨迹,这样便形成了一条时间线,可以实现对所有版本信息的管理和控制。
当你初始化一个Git
仓库时,Git
默认建立了一个分支,通常为master
分支,之后提交的所有版本仅仅对该分支指针进行了移动。但是在项目的实际开发过程中,会涉及到频繁的修改以及提交,这样会使得master
分支指针移动地十分频繁,因此通常会新建立一个分支dev
,用于阶段性的工作,这一阶段的工作结束后,将dev
分支的工作汇总到master
分支上,所以master
分支较为整洁且维护的版本往往功能有较大的增加。例如,对于一个游戏项目,master
分支上维护着游戏发布的版本V0.1
,v0.5
,v1.0
等,而对于某一发布版本在开发过程中通常是在dev
分支上进行的。
分支的建立
Git
中分支的建立非常简单,git branch dev
用于建立一个分支,即新建一个指针,git checkout dev
将当前分支切换为dev
,即接下来操作的是dev
分支的指针,git branch
列出当前仓库中的所有分支,即所有指针。
版本信息的查看
举个例子说明,现在我在master
主分支时间线上提交了两次,这样便形成两个版本,这时我们新建一个新的dev
分支,分别在master
和dev
分支上查看版本信息。
git log
命令可以查看当前分支上的版本信息,可以看到,master
分支和dev
分支上的版本信息是一样的,此时的版本间的关系是这样的:
可见git log
命令会列出当前分支指针前的所有版本信息,要是有版本回退操作,会使分支指针往回移动,git log
命令是无法列出回退前的那些版本信息的。
关于git log
命令的详细参数如下:
git log [参数]
,参数如下:
版本的回退
git
中回退的某一版本是非常方便的,仅仅需要将分支指针指向指定的版本id即可,可以使用git reset commitId
命令实现。例如,我们在dev
分支上,需要将当前的版本回退的上一版本,即69842b
时,
此时的版本示意图如下:
可以看到git reset
命令分支指针之前的版本,要是我们想保留所有的版本信息,我们可以使用git revert commitId
命令,该命令会保留所有的版本信息,同时新建一个版本,这个版本由两部分合并而成,一部分是指定commitId
提交之前的内容,另一部分是commitId
之后的所有操作,这两部分合并,可见git revert
命令保留了中间的版本信息。
例子如下:
git revert
之前:
git revert
之后:
此时的示意图如下:
分支的合并
git
中分支的合并有两种情况,一种是分支间没有出现分叉,另一种是分支间出现了分叉。
分支的合并用命令git merge
。
当没有出现分叉时,此时的合并过程如下图,仅仅将master
分支指针移动到dev
分支指针处,这种方式称为fast-farward
。
可以看到,将dev
分支合并到master
分支后,master
指针和dev
指针指向了同一个版本,且这两个分支维护的版本信息是一样的了。
当然,我们也可以不使用fast-forward
方式,添加参数--no-ff
即可,非fast-forward
模式下,会形成一个新的commitId
,并且master
分支指针会指向它。示意图如下:
结果如下:
当出现分叉时,例如,在master
分支上提交了一个版本,同时我在dev
分支上继续工作也提交了一个版本,这时候合并就出现了分叉,此时master
上的版本信息如下
在dev
分支上的版本信息如下:
用git merge
合并后的版本信息如下,可以看到这种情形下的合并是安装没有分叉时的--no-ff
方式合并的,即会生成一个新的commitId
。
关于Git中的分支管理的内容差不多就这些了,关于分支相关命令的介绍以后再讲解。