git
前言
git工具之前就学过很多遍了,但是一直都没掌握好这个被称为版本管理神器的工具。究其原因,一是学后不用,慢慢遗忘。二是每次也只理解个半吊子水平。终于,这次又鼓起了勇气重新开始学习,为了不再重蹈覆辙,决定将难以理解的地方一一记录成此文,不时翻阅,以加深理解。
ps:记录的一切都只是为了方便我理顺思路,实际内容很可能是错的,切勿盲目相信。
基础概念
存储形式
git的概念中,存在三个对象:commit,tree,blob
下面的伪码能够体现出三者的联系
commit{id,ptr_tree}
tree{id,ptr_tree, ptr_blob}
blob{id,data}
id就是每个对象的检验和(那个20字节,40位16进制的码)
工作区、暂存区、git仓库
工作区就是项目目录,git仓库是.git文件夹
一直有点难以理解的就是暂存区里存的是个什么东西?
答:暂存区里存的是一个tree。每次checkout一个commit的时候,暂存区里就存着commit指向的tree,每次add就是修改tree,每次commit就是把tree给归档了。
checkout指令
checkout相当于一个解压操作,把commit全部解压到工作目录,然后向暂存区里丢一个tree。HEAD指向的就是目前checkout的位置。
文件追踪
在暂存区里tree上的文件就是被追踪了的,没在就没被追踪
文件内容变化不会影响被追踪状态,但是一个文件重命名了就直接没了
HEAD,分支
commit 《- 分支 《- HEAD。
HEAD,分支,tag
这三者实际上都可以看成是指针。用来指示commit的的,所以创建起来很容易。
分支与远程
o/master是个啥
o/master可以理解成远程端的分支在本地端的分身。主要起一个标识的作用,所以每次fetch,pull,push,和远程仓库交流的时候,会同步成和远程端的分支一样的状态。
fetch
fetch 远程 src_ref:dst_ref
把远程src分支拉成本地的dst分支
pull
pull 远程 src_ref:dst_ref
拆解为:
fetch 远程 src_ref:x_ref
merge x_ref
把远程src分支拉成本地的分支x
然后本地的dst分支merge本地分支分支x
push
push 远程 src_ref:dst_ref
把本地src分支推到远程的dst分支
带参数的fetch、push共同理解
只要是dst分支先前不存在,就会自动创建
若dst分存在,操作要成功,那么必须满足,src是dst的子辈commit
src分支为空,就是删除dst分支
追踪分支
追踪分支的作用就在于,把本地分支和远端分支建立了一个联系,当HEAD位于追踪分支的时候,fetch、pull、push就自动设置好了三个参数,所以可以直接git fetch/push/pull。
fetch/push/pull 后接一个分支参数
pull、push填的分支得是追踪分支,还是相当于可以自动填参数
fetch填远程端的分支,直接拉取,同步o/分支
浙公网安备 33010602011771号