是时候咱们该聚焦于 git 的暂存区局部了;当咱们上次增加文件的一部分(“git add <file>”)的时候我咱们隐式的应用了暂存区。这是 git 合其它版本零碎的次要区别,也是个别人容易对它的作用纳闷的中央。
git 的暂存区容许你解冻状态树的一部分,这样随后的“git commit”的就会把解冻的这部分提交。许多的版本零碎都是让你在提交的时候解冻所以没有这个中间状态;当你第一次应用 git 的时候,你通常会“git add”而后了解执行“git commit”,甚至是设置别名把这两件事一起做了。
所以 git 为什么要有暂存区的概念呢?记着,git 应用内容寻址的文件;换句话说,当你执行特定的内容片段的时候会有同样的 identity。当你运行 git add 把那个对象增加到对象库中的时候会产生什么。当对象被增加的共事,还须要一个指针指向它。所以有个被称为暂存区的虚构树,它蕴含了一个指向 blob 和文件映射的树。
以后 add 文件或者 rm 文件的时候,实际上最重批改了这个树,这个树蕴含了你接下来要提交的局部。当运行 commit 命令的时候,它通过这个虚构树构建一个实在的树对象,并且把它提交到库里(同时必定会更新分支)。
只管这个个性不会立刻有用处(并且有些争执认为这是 git 比其它零碎更简单局部),然而它在特定的操作中是很有用的:
- 暂存局部文件会把文件拆解到不同的提交。(局部文件被存到了暂存区,那么工作区的残余局部可能是调试代码,这样能够间接“checkout .”去掉;或者只提交暂存区中测试过的局部)。
- 有大的合并的时候有用,这种状况下可能会有很多的抵触(暂存区能够记录那些没有抵触,那些事解决了的抵触,通过“git add”增加到暂存区;剩下的就是解决多数的差别)。
当运行“git status”的时候,控制台日志会通知咱们暂存区和开发区的对应关系,提醒咱们 git 发现的文件的 diff 信息。为了减速解决,git 通常应用工夫戳确定文件是否扭转,然而此时会全面扫描解决内容的 hash 来确定文件的差别。
暂存的内容实际上是被批改文件的快照。例如:下面展现的重命名和批改被存到了暂存区,同时批改了但没有存到暂存区的不能被提交。暂存区同样和本地库有了辨别。
所以一个文件可能三个备份,包含之前被提交到本地库的版本,以后开发区的版本,被存到暂存区的版本。这就是为什么会在“git status”的时候同一个文件会呈现两个 status 信息。能够应用 git diff 展现暂存区和开发区同一个文件的区别。
援用 https://alblue.bandlem.com/20…