Git - Git内部原理解析 | 解决git版本冲突

学一门语言或者技术,基本的过程是了解到熟悉掌握,再到剖析原理,原理对于理解是很有帮助,而且是巨大的,我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的,不过也有人认为这些内容对于初学者来说可能难以理解且过于复杂。

从根本上来讲 Git 是一套内容寻址 (content-addressable) 文件系统,是一个简单的键值对数据库(key-value data store),我们用一个文件来保存 SHA-1 值,并给文件起一个简单的名字,然后用这个名字指针来替代原始的 SHA-1 值,对比快照,生成新版本的SHA-1数值,如下图:
Git - Git内部原理解析 | 解决git版本冲突

Git的有点在于可以,时刻保持数据完整性,保持版本的独立性,不受其他的分支所影响,Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,原理如下图:

Git - Git内部原理解析 | 解决git版本冲突

这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。Git 更像是个小型的文件系统,但它同时还提供了许多以此为基础的超强工具,而不只是一个简单的 VCS。

Git还有一个点在本地处理数据,没有过分依赖于网络,Git 可以通过两种主要的方式在版本库之间传输数据,dumb和smart协议两种。

下面举一个版本之间冲突的解决方法:(zhangyu_demand_tag -> sim)

git checkout sim (切换到sim分支)
git checkout -b sim_copy(sim复制一个分支)
git branch(查看本地分支绿色为本地分支)

Git - Git内部原理解析 | 解决git版本冲突

git pull origin sim (更新代码,保证当前为最新分支 相当于svn up 命令)
git merge –no-ff zhangyu_demand_tag(合并分支,显示失败,合并中灵魂的一句命令)


备注:–no-ff指的是强行关闭fast-forward方式。fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建commit
git merge –squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。

–no-ff:不使用fast-forward方式合并,保留分支的commit历史
–squash:使用squash方式合并,把多次分支commit历史压缩为一次


Git - Git内部原理解析 | 解决git版本冲突

git status (查看冲突中的文件)

Git - Git内部原理解析 | 解决git版本冲突
在Unmerged paths 里,显示的是冲突的文件名,解决冲突,合并

Git - Git内部原理解析 | 解决git版本冲突

有不明白的同学可以,私信我,看见第一时间回复~