Git的版本控制模型

根据Scott Chacon的《Pro Git》翻译编写。

版本模型

cvs、svn等集中式版本控制系统把每一个要控制版本的文件看作一个单独个体,增量的跟踪对它们的每一次修改。但是git不是这样的,git把版本控制看成是对一个小型文件系统不断创建快照的过程,即每次提交,git都会创建所有受控文件的复本并生成一个引用标识这个快照,当然为了提高性能,没有修改的文件将只是保存一个上个版本的链接。如下图示:

Image(1)

Technorati 标记: git, 版本控制, 模型, 分支, 标签

git会计算每个版本的checksum,使用SHA-1 hash,并使用这个hash值作为键进行索引。

分支模型

cvs、svn的分支是整个工程的一份复制,维护成本比较高。git里的分支是非常强大的工具,创建删除的代价很低,是一个重要的版本管理工具。从本质上来说,分支只是记录了一个提交的checksum值的文件(41个字节),起到引用该提交的作用。还有一个特殊的指针,HEAD,记录了你当前所在的本地分支。

git工程默认会创建一个master分支,假设我们已经在某个工程上提交了三次,那么当前的提交历史应该是图1表示的样子。

image    image    image

                        图1                                        图2                                                   图3

C{n}表示某次提交,矩形表示分支。因为现在只有一个分支,所以HEAD是指向master的。如果这时候有一个bug53需要我们立即修复,那么我们可以创建一个分支iss53,提交历史应该变成图2那样。新创建的iss53分支和master分支实际上是指向同一个提交C2。现在你就可以checkout这个新建的iss53分支开始bug修改了,此时HEAD指向iss53。当完成bug修改后我们提交代码,提交会追加到HEAD分支,也就是iss53分支,提交历史变成图3所示。

我们还可以切换回master分支,创建另一个分支,例如hotfix,用来解决一个hotfix bug,完成修改并提交后,提交历史如图4所示。

image       image

                      图5                                                        图4

hotfix bug经过测试验证后可以部署到生产环境了,在这里C4提交需要合并到master分支(master分支是我们的生产分支)。我们可以执行以下命令:

$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast forward
README | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)

注意,Fast forward这个提示。由于master是hotfix的直接上游分支(即hotfix分支最好从master分支创建),git可以仅仅修改一下master分支所引用的分支,指向hotfix就能够完成代码合并,这种情况就叫做Fast forward。

此时hotfix的所有修改都已经包含在master分支中了,我们可以把hotfix分支删除了,因为分支非常轻量,删除不会太复杂。

除了fast forward合并还有一种叫做三方合并(three-way)。假设我们又在iss53分支上提交了代码,此时提交历史如图5。

 

当我们把iss53合并到master时,由于iss53不是直接从当前的master分支创建的,它们有共同的祖代提交(C2),提交合并时,需要处理C4、C5以及C2三个提交,如图5中的红框标识。当然如果两个分支的提交都修改了同一处代码,git无法自动合并这些修改,此时就产生了一个冲突,需要我们自己解决。

关于分支管理,推荐使用git-flow规范的分支模型,后续翻译篇文章详细说明。

还有一类本地分支叫做远程分支,用于记录远程代码仓库里的分支的状态。远程分支虽然也是本地分支,但是我们没法向这些分支提交代码,而需要通过fetch、pull等网络命令来移动。远程分支按照<remote>/<branch>模式命名。

我们可以从远程分支创建一个本地可改分支,与远程分支建立对应关系,这种分支叫做跟踪分支(tracking branch)。当在跟踪分支上执行push时,本地提交会直接提交到它所跟踪的远程分支。跟踪分支可以通过git checkout –b <branchname> <remote>/<branchname>创建。clone远程代码仓库时,git会自动创建master跟踪分支。

标签模型

标签分两类轻量(lightweight)和注解(annotated)标签。轻量tag类似与一个不会修改的分支,它实际上只是某个提交的一个索引外。注解标签则类似与一次提交,有自己的checksum。

默认情况下,push不会上传tag,如果需要共享tag,使用命令git push <remote> <tag>上传指定tag,或者git push <remote> --tags上传所有tags

转载于:https://www.cnblogs.com/samsong/p/3377718.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值