网上关于Git的使用有太多的博客,文章在讲解了,大部分是在讲解命令的用法,剩下一部分则在讲解git的内部原理,看过讲解基础命令使用的文章后,正常的开发使用是没有什么问题的了,而如果想更深入的了解git“高级”使用,去看第二类讲解内部原理(数据结构,源码实现)的文章,往往感觉过于“高深”,复杂,(而且对git的使用上并不会有太多帮助),其实介于两者之间的知识可能对于git进阶更有帮助。
Git的原理和使用其实很简单,看懂下面这张图就可以了:
上图转自伯乐在线上的一篇文章,侵删。
其实我感觉这应该是某一本讲解git原理的书上的配图(由于学习git过程中都是网上搜索和自悟获取,没有看过专门的git书籍,不太清楚是那本书)
为了符合文章的标题,这里只简单说明下右半部分,这个是大部分基础使用文章忽略的(基础使用都会着重讲解staging area这部分),而高级教程中对于右半边又都是一笔带过,或者大家都不会太注意这部分吧。
git clone之后究竟发生了什么?
- remote repository:这个不用过多解释,虽然git是分布式的代码管理工具,但大部分公司,组织都会建立一个集中的代码仓库服务器。(这里想到区块链到底后面会发展成半集中式还是完全分布式的呢?)该代码仓库存储着所有开发人员push上去的代码和branchs。
- 开发者键入git clone后,git会将远端所有的代码和branchs下载到开发者本地。
- 有人会问,可是我git branch只看到一个branch(默认情况应该是master branch。不过仓库服务端可以进行配置其他任意branch为默认主分支)。git branch的确只能看到一个branch(在本地没有进行checkout -b参操作的情况下),因为其他branch需要用git banch -r(Git branch -a)才能看到。
- 这时有人又会问,git branch -r看到的不是远端的分支吗?好吧,其实本文的唯一有价值的地方就在这里了。git branch -r看到的不是远端服务的branchs,而是你的本地的远端 branchs,git clone后在remote/origin repository区保存一份和此时远端分支一模一样的代码和branchs,而且该区域是不能修改的。
- 如果想修改怎么办,git checkout -b master origin/master相信大家都用过类似的命令,这个是从远端拉出一个branch吗?不是,这是从你的本地的远端区域里的master branch拉出一个branch。而新拉出的branch就是存储在你的local repository区域里,这个区域是可以修改的,也就是git branch看到的那些branchs。
理解了以上两个区域后面有些命令的原理就十分清楚了
- git pull做了什么?
- 大家都知道git pull = git fetch + git merge两个操作。
- git fetch做了什么?
- git fetch其实是更新下你的本地的远端代码区域(remote/origin repository)的数据同服务端的代码保持一致。
- 基于以上的说明,git pull的最后一步,就是把remote/origin repository区域中的相应的branch(已更新到服务端最新代码) merge到本地区域(local repository)的branch上。
以上是自己对git对代码管理上的一些理解,不保证正确性,因为我没有看过一行git源码,以上的分析只是从各种文章,流程图,以及实际使用中推理得出的。只是感觉它应该就是这一个样子的。希望没有误导别人。
最后说下我对git的看法:git不仅仅是一个代码管理工具,它是一种工作方式,基于git的工作流,你可以高效的进行开发工作,通过git的各种命令的组合使用,基本上可以解决你所遇到的所有问题,你可以告别copy n份代码,管理n个目录,告别beyond compare。