学git还是直接看官方文档比较靠谱
官方文档的链接在这:https://git-scm.com/docs
大致来介绍一下:
git 一共有四种区
workspace(工作区)
index/staging area(暂存区)
local repository(本地快照区)
remote repository(远程仓库)
首先,工作区就是本地代码目录,随便新建一个文件夹,之后你想在这个文件夹下创建git,这个文件夹就叫工作区
暂存区,这个顾名思义,就是将你即将提交的代码暂存起来的区域,最终暂存的代码会作为一次“快照”来输出,查看暂存区可以使用git ls-files --stage 命令
本地快照区,关于这个区的名字其实很多网上的资料都不一样,git官方文档也没有固定下名字(我找了几遍,暂未发现),但是,这个区的作用是用来存放快照,这是毋庸置疑的。
remote repository,远端仓库,指网络上保存好的分支以及文件,一般通过push命令来将本地的代码同步到网上,代码到了这里说明提交完成了
接下来用一张图来概括4种区之间的联系和工作模式
就像我之前的笔记的例子:
我本地建立了一个123.txt的记事本,之后,使用add命令将其添加到了暂存区,又使用了commit命令将其变成了一份快照放进了本地快照区,之后用push将其推上了网络上的远程仓库中
这一系列操作对应了图上的下面三根线
你已经明白了一些内在的联系了,但是还不够,接下来讲解更为底层的知识:
在暂存时(add操作时),git会为每一个文件计算校验和,使用的是SHA-1哈希算法,这个checksum也会作为后续很多操作的指针。之后,把文件包成blob对象,将校验和加入暂存区等待commit
关于blob对象:几乎可以等价为源码的二进制
在进行commit操作时,Git 会保存一个提交对象(commit object)。 该提交对象会包含一个指向暂存内容快照的指针,包含了作者的姓名和邮箱、提交时输入的信息(commit -m后你输入的信息)以及指向它的父对象的指针。 首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象
上方描述了一个“commit”之后存放的结点构造:
commit对象,树对象,blob对象
commit对象中存放着指向树对象的指针,本身的校验和,作者和一些其他的信息
树对象中存放的是所有blob对象的指针
而blob对象存放的是源码的二进制
至此一个完整的commit命令就操作完了,这次commit出现了的commit结点就是98ca9
所谓的快照,也可以指commit对象,树对象,blob对象三合一抽象的某种概念
理解了这个之后,就可以更好地理解HEAD,MASTER,ORIGIN等概念了
一般来说,commit之后,git 的head指针也会重新指向新commit的commit结点,head永远指向是“当前”分支
我们使用checkout等命令切换分支时,本质是让head指针指向了不同的分支名称,也是上文所说的“commit结点校验和”
当我们拉下代码,push后,查看git日志时,上方总是会出现一些异色的分支名称,大致是:
head->master, origin/master, origin/head
这里一共出现了4种指针
首先,head就是一个指针,永远指向当前分支,能够让你的“工作区”出现不同时期的代码
master指针是本地代码的分支指针,是默认创建的,一般也会跟随commit来进行移动
origin/master,和origin/head是远端仓库的指针
就像本地有一个暂存快照区,里面保存着一堆commit结点树一样,远端也有一个暂存快照区,里面也有着结点树
这个远端就是被简化写成的origin
这两个结点,origin/head就像本地的head指针一样,它负责显现结点树中该展示的结点
origin/master是一个远端分支,这个是git系列的默认分支名称,如果项目有多种版本,例如穿刺,调试,开发版本号等,都会修改分支名称
远端分支几乎无法通过本地修改,例如checkout怎么都无法变更远端分支,它的移动非常麻烦,我记得曾经做过一个企鹅的项目,远端分支和本地老是冲突,查了很多资料最后是用强制删除结点的方式将远端分支的结点移动
所以,要规划好分支
这一篇大概就介绍到这吧,本文很多理解都引用于官方文档,需要的小伙伴多去看看官方文档
参考的链接:
https://blog.csdn.net/weixin_65775770/article/details/135421020?ops_request_misc=%257B%2522request%255Fid%2522%253A%252225ce3743d63cf2ad8d20a4e63f066e53%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=25ce3743d63cf2ad8d20a4e63f066e53&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-135421020-null-null.142v102pc_search_result_base1&utm_term=git%E5%B7%A5%E4%BD%9C%E5%8C%BA%E5%92%8C%E6%9A%82%E5%AD%98%E5%8C%BA%E5%9B%BE%E8%A7%A3&spm=1018.2226.3001.4187
https://git-scm.com/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%88%86%e6%94%af%e7%ae%80%e4%bb%8b