git在正确的抽象层次上处理存储空间压缩,使得程序比上代(如svn)和同时代(如bzr)的VCS大为简化。
之前的VCS从节省空间出发,想当然地把delta作为基础数据结构。这样的最大问题(远不是唯一问题)是:delta设计时没有考虑到的修改方式就无法表达。例如,svn早期版本及更早的VCS不能记录文件rename/copy,所以只要重命名文件,列出历史时重命名之前的历史就显示不出来。
git的存储层(plumbing layer)提供的接口里,每个commit都记录完整的目录树。存储空间压缩问题完全在存储层内部解决:
有时当你在项目的一个分支上,已经工作一段时间后,所有东西都进入了混乱的状态, 而这时你想要切换到另一个分支做一点别的事情。 问题是,你不想仅仅因为这点别的事,而把刚刚做了一半的工作进行一次提交。
针对这个问题,可以使用 git stash 命令来解决。(stash:贮藏)
git stash 命令会处理工作目录的脏状态,即:根据文件的修改与暂存的改动,然后将未完成的修改保存到一个栈上, 而你可以在任何时候重新应用这些改动(甚至在不同的分支上)。
现在本地版本库中情况如下:
有两分支, master 分支和 dev 分支。
此时正在开发 dev 分支中的 stash.txt 文件。
下面开始演示 git stash 命令用法。
1)从未完成工作 dev 分支,切换到 master 工作。
2)在 master 分支工作完成之后,在切换回 dev 分支。
3)删除Git存储栈中的内容
在工作中通常使用 git stash pop 命令,代替 git stash apply 和 git stash drop 命令。
由于工作中使用git作为版本管理,之前对git的了解不多,特别是底层方面的原理方面的知识。为了能更好的使用git,有必要学习并梳理下相关知识。
步入正题:
执行git init 初始化后,会在.git文件夹下会创建多个目录,每个文件夹功能划分的很清晰。
Git 是一套内容寻址文件系统.通过键值对的方式存储和查找。
下面 *** 作一遍,直观的看到整个过程,以便理解。
参考: https://git-scm.com/docs/git-hash-object
参考: http://man.linuxde.net/find
可以见到文件名称为数字和字母组成的字符串。这个是根据文件内容和头信息(Header),通过SHA-1算法计算得出的40位十六进制校验和。
SHA-1是一种加密哈希函数(cryptographic hash function)。SHA-1将文件中的内容通过其hash算法生成一个160bit的报文摘要,即40个十六进制数字(每个十六进制数字占4位)。它几乎可以保证,如果两个文件的SHA-1值是相同的,那么它们确是完全相同的内容(类似于生活中的指纹识别);SHA-1主要有两种用途,一个是加密,一个是数据完整性校验。Linux kernel开创者和Git的开发者——Linus说,Git使用了SHA-1并非是为了安全性,而是为了数据的完整性。理论上SHA-1会在2^51攻击下实现哈希碰撞,所以也不是完全的安全。
参考: https://git-scm.com/docs/git-cat-file
模拟bolb对象存储流程
以上,说明了git的数据存储的基本方式。主要步骤:
下面是创建文件,修改文件,恢复文件的相关过程。
git会记录每个版本的修改,根据校验和可恢复到相应的版本。
小结: 这个过程中包括文件创建、文件修改、文件恢复,跟我们平时工作中使用的高级命令功能很相似。git会把整个过程转化为底层 *** 作,同时对用户透明。
相关引用参考:
http://smilejay.com/2012/08/git-commit-sha-1/
https://git-scm.com/book/zh/v1/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-Git-%E5%AF%B9%E8%B1%A1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)