git branch

Branching and Merging

 

 

许多使用 Git的开发者都喜欢用这种方式来开展工作,比如仅在 master 分支中保留完全稳定的代码,即已经发布或即将发布的代码。与此同时,他们还有一个名为 develop的平行分支,专门用于后续的开发,或仅用于稳定性测试 — 当然并不是说一定要绝对稳定,不过一旦进入某种稳定状态,便可以把它合并到 master里。这样,在确保这些已完成的特性分支能够通过所有测试,并且不会引入更多错误之后,就可以并到主干分支中,等待下一次的发布。如果在develop分支上又发现一些需要改进的地方,也可以在develop基础上新建topic分支来开发,完成,测试稳定性后在导入到上一层次分支中。

你可以用这招维护不同层次的稳定性。

 

Git 保存的不是文件差异或者变化量,而只是一系列文件快照。

Git中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。

 

初始化git

 

 

 

Git中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。

当使用 git commit 新建一个提交对象前,Git 会先计算每一个子目录(本例中就是项目根目录)的校验和,然后在 Git仓库中将这些目录保存为树(tree)对象。之后 Git创建的提交对象,除了包含相关提交信息以外,还包含着指向这个树对象(项目根目录)的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。

现在git对象库中有4个新建对象,两个表示文件快照的内容blob对象,一个记录目录树内容各个文件对应blob对象索引的tree对象,以及一个包含指向tree对象(根目录)和其他提交信息数据的commit对象。大致关系如下:

 

 

多次提交之后,就会形成一条提交链(提交图)。Git中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的branch-demo-master 分支,它在每次提交的时候都会自动向前移动。

git中,HEAD是一个指向你正在工作中的本地分支的指针(译注:将 HEAD 想象为当前分支的别名。)。HEAD 在一次 checkout 之后移动到了另一个分支。

然后我们在分支上做一次提交:

git库中的实际情况:

假如现在在主分支上,又需要做一些提交和改动:

此时,git对象库又新建三个对象,一个commit,一个tree,一个blob对象

当前版本库的对象库中的逻辑关系如下:

由于 Git 中的分支实际上仅是一个包含所指对象校验和(40 个字符长度 SHA-1字串)的文件,所以创建和销毁一个分支就变得非常廉价。说白了,新建一个分支就是向一个文件写入 41 个字节(外加一个换行符)那么简单,当然也就很快了。

 

这和大多数版本控制系统形成了鲜明对比,它们管理分支大多采取备份所有项目文件到特定目录的方式,所以根据项目文件数量和大小不同,可能花费的时间也会有相当大的差别,快则几秒,慢则数分钟。而 Git 的实现与项目复杂度无关,它永远可以在几毫秒的时间内完成分支的创建和切换。同时,因为每次提交时都记录了祖先信息(译注:即parent 对象),将来要合并分支时,寻找恰当的合并基础(译注:即共同祖先)的工作其实已经自然而然地摆在那里了,所以实现起来非常容易。Git鼓励开发者频繁使用分支,正是因为有着这些特性作保障。

 

合并分支后的逻辑图:

 

 

 

 

 

3.冲突解决

现在,我们在branch-demo-dev分支的基础上,发现一个尝试性的天才想法,然后呢,我们就可以新一个branch-demo-topic分支来验证我们的想法。

切回branch-demo-dev分支:

当前HEAD

此时branch-demo-topic的逻辑图:

现在切回branch-demo-dev分支:

此时的HEAD

Git库存储逻辑结构:

然后将修改过后的branch-demo-topic分支合并到branch-demo-dev

 

可以看到 ======= 隔开的上半部分,是 HEAD(即 branch-demo-dev分支)中的内容,下半部分是在branch-demo-topic 分支中的内容。解决冲突的办法基本上是抛弃一个或者是手动的将他们整合。例如

merge之后,新生成commit,此时git库中的逻辑关系大概如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值