Git分支—分支简介、分支的新建与合并

说明

本篇文章是对Pro Git一书中 3.1 分支简介3.2 分支的新建与合并 章节的总结。

1,Git保存数据到文件数据库的方式

1.1 添加a.txt、b.txt到仓库中

新建a.txt、b.txt文件,将这两个文件添加到暂存区(git add a.txt b.txt)
存储到暂存区后会生产两个blob对象(分别存储的是a和b文件内容),并会生成两个SHA-1(效验码)来指向这两个blob对象。
在将这两个文件提交到本地仓库(git commit a.txt b.txt -m "新建文件a.txt和b.txt"),提交本地仓库后会产生一个commit对象,一个tree对象。commit对象包含了作者、提交人、提交时间、一个tree对象和parent对象等信息,如果是首次提交将不会产生parent信息。tree对象包含了指向blob对象的SHA-1、文件名和文件模式。这一步操作后master分支指向SHA-1为5f19dbf6的commit对象,HEAD指向master。

1.2 修改a.txt文件并提交到仓库

对a.txt进行修改并提交到仓库(git commit -a -m "添加文件类型说明")。添加到暂存区后会产出一个blob对象(存储a文件修改后的内容),并产生一个SHA-1(效验码)来指向这个对象。
提交到仓库后会产生一个commit,一个tree对象。注意:1,这次提交产生的commit对象包含了parent信息。2,我们并没有修改b.txt所以tree对象还是保存上次b文件的SHA-1。这一步操作后master分支指向SHA-1为501833f9的commit对象,HEAD指向master。
从1.1和1.2可以看出:
1,每一次commit产生的对象都会对整个项目做一次快照。
2,Git不保存文件之间的差异,而是保存快照。
这里写图片描述

2,创建分支与检出分支原理

2.1 创建dev分支

创建dev分支(git branch dev)会产生一个指向SHA-1为01833f9的commit对象的分支,现在master和dev分支都指向同一次提交对象。

2.2 捡出dev分支

检出dev分支(git checkout dev)会使HEAD分支指向dev分支。
从2.1和2.2可以看出:1,master和dev分支只不过是指向了某个提交对象的引用,创建一个分支就是将分支引用指向某次提交。2,HEAD是一个特殊引用,表示当前分支。
这里写图片描述

3,在不同branch提交的分叉历史

在dev分支修改a.txt并提交

在dev分支修改a.txt并提交(git commit -a -m "介绍你可以向文件写入什么内容"),可以看到dev指向了新的commit对象。

切换到master分支,对a.txt修改并提交

切换到master分支,对a.txt修改并提交(git checkout master,git commit -a -m "添加介绍说明"),可以看到master也指向了一个新的提交对象。
从3.1和3.2可以看出:1,怎么知道我的提交是在那个分支上是通过HEAD引用,将HEAD引用指向的分支引用指向的commit对象的SHA-1值作为新commit对象的parent。2,分叉历史产生是因为有两个commit对象的parent指向了同一个commit对象,如果产生了历史分叉就不能使用"快进"进行合并。
这里写图片描述

4,merge dev分支到master分支

merge dev分支到master分支(git checkout mastergit merge dev)。在检出dev分支对其a.txt文件进行修并提交到仓库未合并到master之前,我又切换到master对a.txt文件进行了修改并提交到了仓库,导致了产分叉历史。在这种情况下将dev合并到master分支是就会产生冲突,需要我们手工对a.txt进行合并,合并的版本是SHA-1为bd61a96的commit对象和SHA-1为89a6a5的acommit对象以及这两对象的共同父commit对象(01833f9)做一个三方合并————红色边框的三个commit对象。手工合并(手工修改那个版本是你需要的,那个版本是你不需要的,或两者都需要)a.txt文件后执行git add a.txtgit commit将会产生一个SHA-1为d44c096的commit对象,这个commit对象有两个父commit对象(bd61a96、89a6a5a)。
从4可以看出:1,产生分叉的历史提交不能进行"快进"合并,需要我们手工解决冲突才能合并。2,三方合并产生新的的commit对象,这个commit对象有两个paretn commit对象。
这里写图片描述

5,merge iss11分到到master分支-快进(fast-forward)

5.1,在iss11分支进行2次提交

我们现在有个紧急bug需要修复,我们根据master分支检出一个iss11分支用来修复bug。我们在iss11分支上提交了两次完成了bug的修复,并决定将iss11合并到master。

5.2,merge iss11分支到master分支

在iss11分支修复bug期间master分支没有发任何修改,我们在将iss11合并到master分支是就可以使用快进(fast-forward)合并。由于当前 master 分支所指向的提交(d44c096)是你iss11当前提交(34af7c6)的直接上游,所以 Git 只是简单的将指针向前移动。 换句话说,当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支(分支的最后一次提交),那么 Git 在合并两者的时候,只会简单的将指针向前推进,因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。
这里写图片描述
最后附一张总图
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值