理解git暂存区

是时候我们该聚焦于git的暂存区部分了;当我们上次添加文件的一部分(“git add ”)的时候我我们隐式的使用了暂存区。这是git合其它版本系统的主要区别,也是一般人容易对它的作用疑惑的地方。
git的暂存区允许你冻结状态树的一部分,这样随后的“git commit”的就会把冻结的这部分提交。许多的版本系统都是让你在提交的时候冻结所以没有这个中间状态;当你第一次使用git的时候,你通常会“git add”然后理解执行“git commit”,甚至是设置别名把这两件事一起做了。
【理解git暂存区】所以git为什么要有暂存区的概念呢?记着,git使用内容寻址的文件;换句话说,当你执行特定的内容片段的时候会有同样的identity。当你运行git add 把那个对象添加到对象库中的时候会发生什么。当对象被添加的同事,还需要一个指针指向它。所以有个被称为暂存区的虚拟树,它包含了一个指向blob和文件映射的树。
当前add文件或者rm文件的时候,实际上最重修改了这个树,这个树包含了你接下来要提交的部分。当运行commit命令的时候,它通过这个虚拟树构建一个真实的树对象,并且把它提交到库里(同时肯定会更新分支)。
尽管这个特性不会立即有用途(并且有些争论认为这是git比其它系统更复杂部分),但是它在特定的操作中是很有用的:

  1. 暂存部分文件会把文件拆解到不同的提交。(部分文件被存到了暂存区,那么工作区的剩余部分可能是调试代码,这样可以直接“checkout .”去掉;或者只提交暂存区中测试过的部分)。
  2. 有大的合并的时候有用,这种情况下可能会有很多的冲突(暂存区可以记录那些没有冲突,那些事解决了的冲突,通过“git add”添加到暂存区;剩下的就是处理少数的差异)。
当运行“git status”的时候,控制台日志会告诉我们暂存区和开发区的对应关系,提示我们git发现的文件的diff信息。为了加速处理,git通常使用时间戳确定文件是否改变,但是此时会全面扫描处理内容的hash来确定文件的差异。
暂存的内容实际上是被修改文件的快照。例如:上面展示的重命名和修改被存到了暂存区,同时修改了但没有存到暂存区的不能被提交。暂存区同样和本地库有了区分。
所以一个文件可能三个备份,包括之前被提交到本地库的版本,当前开发区的版本,被存到暂存区的版本。这就是为什么会在“git status”的时候同一个文件会出现两个status信息。可以使用git diff 展示暂存区和开发区同一个文件的区别。
引用 https://alblue.bandlem.com/20...

    推荐阅读