為什麼git比其他版本控制系統設計得優秀,因為git跟蹤並管理的是修改,而非檔案,比如你修改了乙個檔案,然後用git add把它加到暫存區,然後再一次修改這個檔案,然後用git commit命令提交到某個分支,此時你再用git status命令能看到第二次修改並沒有提交,甚至都還沒到暫存區,因為git add的時候只是把第一次修改加到快取區,git commit只負責把快取區的內容提交。
撤銷修改有下面三種情況:
僅修改工作區還沒有加到快取區(git add 之前)
加到快取區但還沒提交(git commit之前)
已提交通過git status命令,git會告訴你,git checkout -- file
可以丟棄工作區的修改,該命令作用是把快取區的內容恢復到工作區,如果快取區沒有內容,則恢復到版本庫中的內容,也就下面兩種情況:
一種是檔案自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是檔案已經新增到暫存區後,又作了修改,現在,撤銷修改就回到新增到暫存區後的狀態。
總之,就是讓這個檔案回到最近一次git commit
或git add
時的狀態。
假如修改已經add到快取區,此時怎麼撤銷工作區回到版本庫的內容,上面提到的git checkout -- file命令只能把快取的資料恢復到工作區,當工作區沒有修改的內容時才會恢復到版本庫內容。所以我們首先要把快取區的內容恢復到版本庫內容,同樣的當我們用git status命令時,git會告訴我們,用命令git reset head
可以把暫存區的修改撤銷掉。
git reset
命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用head
時,表示最新的版本,版本回退一章中可以看到,head^ 代表上乙個版本,head^^代表上上乙個版本。
下圖中readme.txt檔案add到快取區後又修改了一次
現在執行git reset head readme.txt命令
可以看到,該檔案第一次修改的內容已經不在快取區中了,但此時工作區的內容是沒有任何改變的,還是第二次修改後的內容。我們再執行git checkout -- readme.txt命令時,工作區便被恢復到版本庫的最新版本內容,也就是說第
一、二兩次的修改都被撤銷了,假如你只要撤銷第二次修改,則直接用git checkout -- readme.txt命令即可,假如add第一次修改到快取區之後,沒有再做第二次修改,則還是需要上面兩步,因為不管什麼情況下,git reset head readme.txt命令都不會改變工作區。
由於已提交到指定分支,首先執行git reset head^ readme.txt命令,把快取區恢復到版本庫的前乙個版本,如下圖:
此時可以看到工作區的檔案內容被恢復成head^版本的內容,但快取區還有乙份資料,快取區的內容和工作區的內容是相同的,因為工作區就是從快取區恢復回來的,從git提示可以看到,可以通過git reset head命令把快取區資料清空,但最好不要這樣做,因為該命令是把版本庫分支上的head內容恢復到快取區(之所以提示快取區有待提交的內容,就是因為快取區的內容和版本庫分支上的head內容不同),如果我們不小心執行了該命令,則可以看到下圖:
雖然快取區資料和分支上的最新版本是一致的,但工作區內容與最新版本不同,此時,需要重新add到快取區,然後再提交到分支上,明顯這樣多了很多步,其實我們可以在前面快取區有資料的時候,直接commit,這樣分支上的內容就和工作區一致了。
總結步驟就是:
git reset head^ readme.txt
git checkout -- readme.txt
git commit -m 恢復readme.txt檔案到上一版本
第2和第3步位置可以調換,因為可以先提交快取區,再從分支上恢復工作區。
07 時間機穿梭 刪除檔案
假如我們在檔案系統中把乙個檔案test.txt刪掉,執行git stauts可以看到 git status on branch master changes not staged for commit use git add rm to update what will be committed u...
04 時間機穿梭 版本回退
03節的時候我們已經成功地新增並提交了乙個readme.txt檔案,現在,我們繼續修改readme.txt檔案。執行git status命令看看結果 git status on branch master changes not staged for commit use git add to up...
Linux 06 時間 搜尋 壓縮指令
例如 date y m d h m s 格式化顯示當前年月日,雙引號內第乙個字元必須為 號。引數 s set的意思,設定當前系統時間,如 date s 2000 01 01 00 00 00 例如 cal 2000顯示2000年的日曆,不加引數為顯示本月日曆。例如 find name hello.t...