Git核心原理,30分钟搞定
关于git有很多文章,主要是从命令操作角度、场景功能来讲解的,比如Git教程 - 廖雪峰的官方网站,前辈的文章非常优美,阅读次数超过了650w,OMG,膜拜。
这个小文章从数据角度来,来讲解git的功能和命令
核心:工作区、暂存区、版本库
- 工作区:你当前进行工作的区域,是文件系统的概念
- 版本库:记录了你工程某次提交的完整状态和内容,这意味着你的数据永远不会丢失。
- 暂存区: 记录了下次提交将要保存到版本库中的文件
简单来说, GIT流程就是将工作区中的文件,先保存到暂存区中,当执行commit的时候,将暂存区中的文件保存到版本库中!如果暂存区没有内容,就没有办法commit!
从数据操作角度来说,分成如下几种
- 工作区与暂存区之间的数据交互
- 将工作区文件保存到暂存
git add - 清除暂存区文件
git reset -- index.html (删除暂存区的修改)
git rm --cached (删除暂存区的文件,工作区文件不删除) - 将暂存区文件还原到工作区
git checkout -- index.html
- 暂存区与版本库的数据交互
- 将暂存区的文件保存到版本库
git commit -
撤销版本库最后一次提交
image.png
git reset --mixed HEAD^ (撤销上次commit,工作区不变,暂存区清空)
image.png
git reset --soft HEAD^ (撤销上次commit,工作区、暂存区恢复到最后状态,可以重新commit)
image.png
git reset --hard HEAD^ (撤销上次commit,工作区回退,暂存区清空)
image.png
git revert (做了一个反向修改的commit)
image.png
3 . 将版本库内容还原到暂存区
git reset --soft HEAD
-
其他
- 版本库内容还原到工作区
git reset --hard HEAD
- 版本库内容还原到工作区
核心:blob、tree、commit、refs(分支、tag)
-
blob 对象保存的仅仅是文件的内容
-
tree 对象更像是操作系统中的文件夹,它可以保存blob对象和tree 对象。一个单独的 tree 对象包含一条或多条 tree 记录,每一条记录含有一个指向 blob 对象或子 tree 对象的 SHA-1 指针,并附有该对象的权限模式 (mode)、类型和文件名信息等:
image.png -
commit 对象的格式很简单:指明了该时间点项目快照的顶层tree对象、作者/提交者信息(从 Git 设置的 user.name 和 user.email中获得)以及当前时间戳、一个空行,上一次的提交对象的ID以及提交注释信息
image.png
总结:,blob为文件内容,tree记录了文件信息、blob sha1信息,commit是根据tree计算得到的快照id。 -
refs是References的缩写。引用是变量名(名字),值指向commit对象,方便追踪代码的变化
image.png
总结:,NND,分支、tag的信息就是一个指针啊,这样消耗资源非常少啊,所以可以多创建分支、多创建分支。
PS,删除分支时,是不是删除了refs变量名啊,所以commit、tree、blob都没有删除?对吧?
本地版本、remote版本
这个不展开介绍,仅列几个命令
git fetch (拉起远程版本库,但是不合并到本地版本库)
git pull (拉取远程版本库,合并到本地版本库)
git push (推送到远程版本库)
git merge
额外:隐藏区
由于git适合多分支切换开发,所以有时候需要将修改临时保存一下,当分支开发完成后,切换回来继续修改之前的内容。所以git提供了一个很少用但是很有用的功能,git stash,仅列几个命令
git stash save 保存当前工作目录文件
git stash restore 恢复保存的工作目录文件
git stash drop 删除保存记录
git stash pop 恢复最后一个的工作目录文件,并删除保存记录
git stash list 查看所有保存记录
git stash clear 删除所有保存记录
来一个🌰
# ... hack hack hack ...
$ git stash
$ edit emergency fix
$ git commit -a -m "Fix in a hurry"
$ git stash pop
# ... continue hacking ...
结束
Mission Complete!