不知道你們在學習Git的過程當中,有沒有想過一個問題,就是爲何要有git add 命令.git
當一個文件被咱們add事後,每次commit前仍是須要git add,爲何不像svn那樣只用add一次,之後在也不用add命令了.並且咱們add文件後,再去修改文件,而後執行commit命令,最後的修改並不會被commit到倉庫,這也增長了提交錯誤的風險.svn
談論這個問題前,咱們有必要了解一下Git環境下,文件常見的幾種狀態.學習
文件從沒有被add過spa
執行add命令後設計
執行commit命令後get
執行commit後再進行修改it
還有一種是執行add命令後,不commit,而後修改文件io
如今咱們來討論上述幾種狀況:file
說明文件並無被git管理,全部的git命令對它都不起做用(git add命令除外)。循環
2. change to be committed
說明文件準備好被提交,加入到倉庫中。
3. nothing to commit, working directory clean
說明工做區和倉庫文件相同
4.changes not staged for commit
說明本地文件和倉庫不一樣
5. 對於同一個文件既有change to be committed 又有 change not staged for commit
說明文件在add後進行了修改,若是這時候直接執行commit, add事後進行的修改不會修改到倉庫,文件的狀態會變爲第四個,changes not staged for commit:
若是這時候執行add,而後在commit,這樣add後的修改也會一塊兒提交到倉庫。
咱們平時使用git的時候通常都是2,3,4不斷的循環,如今假設Git中沒有add命令會怎麼樣呢?
咱們會發現只會有三個狀態1,3,4,少了狀態2,4,咱們只須要在3,4兩個狀態間循環就能夠。也許你會說這不是很好嘛,簡單了不少,可是每每複雜的設計是爲了帶來更多的功能。
通常狀況下,一次commit表明完成了某項操做。假如說你一天會完成一項工做,也就是會commit一次,上午完成了一半的工做,下午來的時候發生了意外,你只能將你的代碼倒回到今天剛上班的時候,上午的工做也將付之東流。可是有了git add 命令,你能夠在隨時add,若是代碼出現了問題,能夠隨時倒回到git add 時候的狀態。你還能夠隨時比較當前代碼和git add 時代碼的差異,git add 時和倉庫代碼的差異,當前代碼和倉庫代碼的差異。簡單來講以下圖(並不徹底精確,有些命令會重用):
本文主要參考以下的知乎的回答,若有興趣自行閱讀.