当然,最直接的原因就是git发明了一个叫做暂存区的概念,但是为什么要发明这个概念呢?没有暂存区可以不?为什么一定要有暂存区,这才是真正的问题好吧。
要解释这个问题,首先要回到GIT的前辈上来,SVN,集中式源代码管理工具的集大成者。
我们知道SVN相较于第一代源代码管理工具如VSS、CVS有几个显著的区别,其中最重要的特性之一就是原子性提交,每一个提交都是由多个文件的修改组成,而且这个提交是原子性的,要么这些修改全部成功,要么全部失败。
原子性提交带来的好处是显而易见的,这使得我们把项目整体还原到某个阶段或者时间点变得极为简便,就这一点SVN就完虐VSS等源代码管理工具。
Git作为目前逼格最高的源代码管理工具,SVN这个优良的特性显然是要借鉴的。但是Linus马上发现了一个麻烦事儿,在命令行下面选择要提交的修改,还真TM是个麻烦事儿,因为用SVN的时候我们都是这么玩的:
git add是保存到暂存区,commit才是提交到服务器上。为什么要有暂存区概念,因为这是为了借鉴svn的批量提交而设置的,svn在GUI里面可以选择需要提交的项,而git最初是命令行来操作,所以就相出了一个暂存区概念,把需要提交的项,先放到暂存区里,这样就解决了问题