“快照的基本思想其实和immutable.js类似,使用immutable生成的对象都是不可变对象,每次对该对象进行修改都会生成一个新的对象,那么是不是意味着需要把原来的旧对象重新复制一遍?显然不是,immutable会维护一个树形结构,新对象的修改只会添加某些节点,然后返回一个新的指针,并与旧对象共用相同的部分。git快照也是这样,只不过是在文件系统层面实现的。我们都知道当你删除一个文件后,文件原来所占的磁盘空间并不是被清空,而是被文件系统标记为“已废弃,可修改”的状态,快照的作用就相当于将旧文件所占的空间保留下来,并且保存一个引用,而新文件中会继续使用与旧文件内容相同部分的磁盘空间,不同部分则写入新的磁盘空间。总的来说git其实也算是保存diff的方式,只不过是在文件系统层次上实现的。”
作者:主公
链接:https://www.zhihu.com/question/27680108/answer/156748005
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
感觉这个答案比较靠谱点。每个文件的存储是分为不同的data block进行存储的,文件系统则是记录该文件存储的每个data block的编号,所以我个人觉得快照可以简单地理解为对这些data block的编号的记录,当你对一个文件做出修改时,未改动的地方仍然沿用旧的data block编号,而新的改动则存储到新的data block并记录到新的快照中。图2.4和2.5分别是Linux和Windows的文件系统记录data block编号的方式,可以有个相对直观的感受。