比如一个文件readme.txt 。修改一次 git add ,第二次修改,然后 git add ,第三次修改 然后再git add。这时候你会发现以上三次add形成的blod文件都留在硬盘上。不明白Git如此设定的目的是什么?留下前两个版本的blod文件在暂存区有什么作用呢?
暂存区保留第三版blod文件,那么当你在工作区又修改了readme.txt以后,git stauts git diff 都会用到第三版的 blod文件。但是前两版的blod有什么用呢?站在用户需求的角度想不到这两个老版本有什么用?而且commit时会提交两个老版本blod文件么?
如果它们有用,那么git为什么要专门提供 git prune命令去删除前两个版本呢?
如果说它们没用吧,那么git add 时为什么不采用覆盖机制,直接用新版blod替换掉上一版的blod文件呢?
如果是为了回滚,那么在什么场景下回滚代码不用Git库中的,一定要用暂存区的历史版本呢?
这是一个很好的疑问。Git在add后保留多个版本的blob对象的设计固然让人费解。但它有以下几个目的:
所以,可以看出,Git保留多个blob对象版本有一定的意义和作用。但是,为了避免blob对象过多占用空间,Git提供了git gc和git prune来清理不需要的blob对象,这也是很贴心的设计。
一般来说,可以这么理解:
由于提交代码过程中使用了多次的git add命令,导致暂存区中留下了多个垃圾对象,这些旧版本的垃圾对象在用户的需求下可能没有用处。有以下几个问题:
对于这些问题,我的回答如下:
暂存区保留多个版本的垃圾对象可以让用户灵活地管理代码版本。比如,当用户需要回滚代码时,可以从暂存区中选择历史版本进行回退操作,而不是直接回滚到最新版本。此外,暂存区中保留多个版本的垃圾对象也可以为用户提供历史版本的代码对比,帮助用户更好地了解代码的变化和发展过程。
当执行git add操作时,我们添加的是一个快照(snapshot)而不是直接替换文件。每次执行git add操作都会将当前文件的快照保存到暂存区中,即使这些快照内容没有改变,也会创建一个新的对象来代表当前文件。这样做的目的是为了保证代码版本的完整性和可追溯性。如果不保留历史版本,当我们需要回滚代码时,就无法找到之前的版本了。
回滚代码时,不一定非要使用暂存区的历史版本。可以使用git log命令查看提交历史记录,然后使用git checkout命令切换到指定的提交记录即可。但是,如果回滚的代码涉及到多个文件,那么使用暂存区的历史版本就比较方便了,因为它可以让我们一次性回滚多个文件的版本。此外,使用暂存区的历史版本还可以保留最新版本代码的备份,方便用户以后再次使用。如果不使用暂存区的历史版本,将会丢失这个优势。
1 .可以将commit颗粒化,解耦,更方便,更灵活。
2. 便于查询自己的更改,(你要是每次都commit,那得多少版本啊,所以有个暂存区),以及回退。