Git文件的四大状态
Git文件的四大状态分别是untrack,modified,committed和staged。
untrack
track有轨道以及记录的意思,所以untrack就是还没记录。那么什么样的东西是还没记录的呢?比如可以想到新生儿,刚出生的新生儿名字都没有,当然也没有记录在案,所以需要登记一下人口。那么在登记之前,就可以认为这些新生儿是untrack的。
在开发中,我们新创建的文件其实就是系统里的“新生儿”。在我们将它们记录在案之前,它们的状态就是untrack。所以当你在一个git项目当中新建了文件的时候,如果你用git status命令去查看git当中的状态,就会看到系统会提示你有些文件状态是untrack。
系统提示我们可以用git add命令来track它。这个也是git很人性化的一点,很多时候它会提醒我们可以使用什么命令做成什么样的事情。所以大家千万不要忽视这些日志,里面的信息是很重要的。
modified
modified顾名思义就是修改过的意思。针对的就是已经登记在案的文件最近又发生了改动的情况,也就是说我们最近改过了某一个之前已经登记在案的文件,那么当我们查看状态的时候得到的就是modified,表示改动了,之前的记录已经不是最新的了,我们需要更新。
同样,我们可以通过git status命名来查看modified的情况。
可以使用git add命令来将它更新,或者是使用git restore命令来取消这个文件的登记信息,也就是让他回到“新生儿”的状态。
staged
staged可以理解成暂存。也就是说我们把所有的改动都记录下来了,现在git系统当中记录的已经是这个文件最新的状态了。
当我们创建了新的文件,或者是有了新的改动,执行git add之后,得到的状态就是staged。这个时候当我们执行git status,就会看到我们当下创建和更新了哪些文件。注意在所有的改动都暂存的情况下,git status是不会出现红色的提示的,只会有绿色的提示信息。
committed
committed表示的已提交。前面说了staged只是暂存,还没有真正提交进git系统当中。只有通过命令git commit之后,才算是真正把暂存区的代码提交了。经过git commit命令之后,所有被提交的文件的状态就是committed。
这个时候如果我们执行git status再来查看,会看到提示nothing to commit, working tree clean.
这就表示我们所有的改动都已经提交进本地的git仓库当中。
用一张图来总结一下上面提到四种状态,以及git的整个工作流来加深一下印象。
总结
git add可以把所有的改动,无论是修改的还是新建的都存入暂存区。git commit可以将暂存区的改动提交到本地git仓库,最后git push可以把本地仓库的改动同步到远端。看起来好像平平无奇对吧,但我们仔细琢磨会发现一个很奇怪的点,那就是既然我们git add和git commit都是提交,只不过是提交的目的地不同,一个是暂存区一个是本地仓库。那么为什么我们不能直接将它们合并呢?我们git add就是直接提交到本地仓库不行吗?
实际上SVN这个版本控制工具就是这么做的,但是这有一个问题就是当我们提交的时候,它会让我们选择我们要提交的文件。如果改动量小还好,如果改动量很大,我们要手动去一个一个输入需要提交的文件显然是一个非常麻烦的事情。而有了暂存区之后,我们就可以在开发的时候,一边开发一个边把文件提交到暂存区,最后直接一起commit到仓库就可以了。就可以避免最后提交之前的麻烦了,因为反正提交这个操作一定是原子的,要么全部成功,要么全部失败,是不允许部分成功这种情况发生的。