當(dāng)我們弄清楚GIT的幾種文件狀態(tài)之后,這一部分的內(nèi)容就變得簡(jiǎn)單了,我們通過(guò)一個(gè)具體的例子來(lái)了解一下GIT的修改和修改還原。首先創(chuàng)建一個(gè)新的文件夾并且通過(guò)git init將其設(shè)置為git的工廠,添加一個(gè)a.txt的文件,使用git add .將其設(shè)置為Staged狀態(tài)之后通過(guò)git commit -m "first"將其添加到git的版本庫(kù)中。這些操作相信大家已經(jīng)能夠熟練的掌握了。
下一步我們修改一下a.txt文件,執(zhí)行git add .再次將其提交到Staged狀態(tài),此時(shí)我們先不進(jìn)行commit,我們向a.txt中寫入一些內(nèi)容,使用git status看看情況

我們發(fā)現(xiàn)a.txt處于兩種狀態(tài)Staged和Modified,這是因?yàn)槲覀兊谝淮涡薷倪M(jìn)行了add之后它變成了Staged狀態(tài),Index對(duì)這次操作進(jìn)行了記錄,但此時(shí)再次修改了之后,Index發(fā)現(xiàn)a.txt的內(nèi)容和版本庫(kù)中不一致,所以也將它的狀態(tài)改為了Modified狀態(tài),此時(shí)進(jìn)行commit操作。

我們發(fā)現(xiàn),該文件僅僅只是提交了Staged狀態(tài)的修改,而Modified狀態(tài)的文件并沒(méi)有進(jìn)行提交,這再次證明了上一節(jié)課的內(nèi)容,只有Staged狀態(tài)才能commit到版本庫(kù)中,如果是Modified狀態(tài),需要先通過(guò)add將其設(shè)置為Staged狀態(tài)(也就是第一講中所說(shuō)的暫存區(qū))。此時(shí)如果我發(fā)現(xiàn)我這次的修改沒(méi)有意義,希望a.txt能夠和版本庫(kù)中的內(nèi)容一致,只要使用以下命令即可
git checkout a.txt
查詢一下a.txt,我們會(huì)發(fā)現(xiàn)該文件的內(nèi)容已經(jīng)和版本庫(kù)中一樣了。

所以通過(guò)checkout可以很方便的讓自己的文件同步版本庫(kù)中的內(nèi)容,注意使用checkout只能同步modified狀態(tài)下的內(nèi)容,此時(shí)我們?cè)俅螌?duì)a.txt進(jìn)行修改,并且通過(guò)add進(jìn)行操作之后,a.txt的文件狀態(tài)就從Modified變成了Staged狀態(tài),我們?cè)賮?lái)使用checkout看看效果。

此時(shí)我們發(fā)現(xiàn)checkout并不能還原原來(lái)的文件內(nèi)容了(我們將會(huì)在下一講講解git的三種常用組件,到時(shí)候就知道為什么無(wú)法還原了)。所以我們得到一個(gè)結(jié)論checkout命令并不能還原Staged狀態(tài)的內(nèi)容,此時(shí)可以通過(guò)
git reset HEAD a.txt
把該文件從Staged狀態(tài)設(shè)置為Modified狀態(tài),也就是將這個(gè)文件從暫存區(qū)中清除。

之后通過(guò)git checkout a.txt就可以把內(nèi)容還原了。
這節(jié)課的內(nèi)容就到這里了,只要掌握了git的幾種狀態(tài)之后,這個(gè)內(nèi)容非常好理解。下一講將會(huì)講解git最核心的知識(shí),就是git最常用的三個(gè)組件BLOB、Tree、Commit。