Git分支

一、概述

Git和传统的版本控制工具最大的区别在于分支,学习分支才能说是真正的掌握git的使用。
其他版本控制工具都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支很慢,但是在git上,无论创建、切换和删除分支,Git都很快完成。

大多数版本控制系统在创建分支时,将所有的项目文件都复制一遍,并保存到一个特定的目录。 完成这样的过程通常需要好几秒钟,有时甚至需要好几分钟,项目越大,所需时间的越长。

在 Git 中,基于Git的数据存储方式,任何规模的项目都能在瞬间创建新分支,而且分支合并也同样的简单和快速。

所以使用Git,鼓励频繁地创建和使用分支做不同的任务。

二、Git分支基础知识

我们假设现在有一个工作目录,里面包含了三个将要被暂存和提交的文件。 暂存操作会为每一个文件计算校验和(SHA-1 哈希算法),然后会把当前版本的文件快照保存到 Git 仓库中(Git 使用 blob 对象来保存它们),最终将校验和加入到暂存区域等待提交
在这里插入图片描述

当使用 git commit 进行提交操作时,Git 会先计算每一个子目录的校验和,然后在 Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,该提交对象会包含一个指向快照的指针,还包含了作者的姓名和邮箱、提交时输入的信息、指向它的父对象的指针以及包含指向这个树对象的指针。

在这里插入图片描述

每次提交,Git 会保存一个提交对象,多次提交之后,那么这次产生的提交对象会包含一个指向上次提交对象(父对象)的指针。

在这里插入图片描述

三、Git分支理解

每次提交,Git都把它们串成一条时间线。

截止到目前,只有一条时间线,在Git里, 这个分支叫主分支(master),就是GIt默认分支,它就跟其它分支完全没有区别。

Git 的分支,本质上是指向提交对象的可变指针

Git 是怎么知道当前在哪一个分支上?
很简单,它有一个名为 HEAD 的特殊指针,可以将 HEAD 想象为当前分支的别名,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,
就能确定当前分支,以及当前分支的提交点:

在这里插入图片描述

每次提交(commit),master分支都会向前移动一步,随着你不断提交,master分支的线也越来越长

在这里插入图片描述
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,
通过checkout命令再把HEAD指向dev,就表示当前分支在dev上:

在这里插入图片描述

从现在开始,对工作区的修改和提交就是针对dev分支了,
提交一次(commit),dev指针往前移动一步,而master指针不变

在这里插入图片描述
假如我们在dev上的工作完成了,我们切换到master分支的时候,可以看到工作区文件是之前的
样子,所以切换分支不仅使HEAD指回master 分支,而且将工作目录恢复成 master 分支所指向的快照内容

在这里插入图片描述

现在我们可以把dev合并到master上,合并就是把master指向dev的当前提交,就完成了合并:

在这里插入图片描述
合并完分支后,可以删除dev分支。
删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支

在这里插入图片描述

四、Git分支操作

1 创建分支,要确定在哪个分支上创建子分支

在这里插入图片描述

2 现在在dev分支上正常提交,比如对hellodongnao.txt做个修改,加上一行,然后提交

在这里插入图片描述

3现在我们需要将dev分支合并到master分支
现在切换到master分支上,查看文件还是master之前的提交状态,因为那个提交是在dev分支上,而master分支此刻的提交点并没有变。

在这里插入图片描述

4 合并完成后,可以删除dev分支了

在这里插入图片描述

五、分支冲突解决

合并操作不会如此顺利, 如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,合并它们就会出问题。

现在我们重复上面分支的操作
1 创建一个devOne分支
2 在devOne分支上进行修改和提交操作
3 切换回master分支,对同一个文件进行修改和提交操作
4 合并devOne分支
5 删除devOne分支

在这里插入图片描述

HEAD指向master 分支,在======= 的上半部分,
而 devOne分支在 ======= 的下半部分。
你可以选择使用由 =======分割的两部分中的一个,也可以自行合并这些内容。

分析问题出现的原因:既在devOne分支上做了修改提交,也在master分支上对同一文件做了提交,导致合并devOne分支的时候出现了问题。

发生冲突了怎么办?
hellodongnao.txt合并发生了冲突,手动解决后,对每个文件使用 git add 命令来将其标记为冲突已解决冲突再提交。

在这里插入图片描述

冲突解决了,最后删除devOne分支

六、非Fast forward合并

$ git merge --no-ff -m “xxxxxx" devTwo
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去

我们之前说的合并分支时,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
现在我们不用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

1 创建一个devTwo分支
2 在devTwo分支上进行修改和提交操作
3 切换回master分支,用非Fast forward的方式合并devTwo分支
4 删除devTwo分支

$ git log --graph --pretty=oneline --abbrev-commit
查看分支历史合并情况

在这里插入图片描述

不用Fast forward模式,分支历史上就可以看出分支提交信息和分支的信息

七、自动非Fast forward合并

Git也会自动使用非Fast forward模式,如分支分叉的情况,git会自动使用非fast模式
在这里插入图片描述
这和之前合并 devTwo分支的时候看起来有一点不一样,开发历史从一个更早的地方开始分叉开来。
所以Git 帮我们做了一些额外的工作,出现这种情况的时候,Git 会使用两个分支的末端所指的快照以及这
两个分支的工作祖先(分叉点),做一个简单的三方合并。

Git也会自动使用非Fast forward模式,如分支分叉的情况,git会自动使用非fast模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值