Git檔案修改,撤銷修改,刪除
參考廖老師教程
Git和其他版本控制系統比如SVN的一個不同之處就是有暫存區的概念。
工作區
在電腦裡能看到的目錄,比如我的倉庫 flask_case 資料夾就是一個工作區:
版本庫
工作區有一個隱藏的目錄 .git ,這不能算是一個工作區,因為它是隱藏的,它是Git的版本庫。
Git的版本庫裡存了很多的東西,其中最重要的是index(或者叫stage)的暫存區,還有Git為我們自動建立的第一個分支master(我們建立的那個倉庫資料夾就是),以及指向master的一個指標叫HEAD。
我們將檔案往Git版本庫裡新增的時候,是分兩步執行的:
第一步:使用 git add命令將檔案新增進去,這裡實際是將檔案修改新增到暫存區;
第二步:使用git commit提交修改,實際就是將暫存區的所有內容提交到當前分支;
因為我們建立Git版本庫時,Git自動為我們建立了唯一一個 master 分支,所以 git commit 就是往master分支上提交修改。
也就是說,需要提交的檔案修改通通在暫存區呆著,然後git commit 一次性提交暫存區的所有修改。
這裡先對 readme.txt做個修改,然後再到工作區中新增一個test檔案,最後用git status檢視下狀態:
Git提示,readme.txt被修改了,而test從來沒有被新增過,所有狀態為Untracked。
現在需要執行git add 將readme.txt和test新增到暫存區裡面,然後在git status檢視如下,
現在,暫存區的狀態就變成下面重要的狀態了:
所有,git add 命令實際就是把要提交的所有修改放到了暫存區中,,然後執行git commit 就可以一次性把暫存區的所有修改提交到分支。
提交後,如果沒有戳工作區再做修改,那麼工作區就是"乾淨的":
此時提交後的版本庫就變成了如下狀態,而暫存區就沒有任何內容了:
管理修改
Git比其他版本控制系統優秀的地方就在於Git跟蹤並管理的是修改,而非檔案。
舉例說明如下,首先我們對readme.txt檔案做一個修改,這裡我隨便添加了些內容;
然後新增到暫存區,檢視狀態;
然後再修改readme.txt
然後我開始提交:
我再檢視git的狀態,這裡感覺好像落下了什麼。。。
還有修改沒有提交?,我們回顧下剛剛的操作: 第一次修改-> git add ->第二次修改-> git commit
在前面有講到,Git管理的是修改,當你使用git add 命令後,工作區的第一次修改被放到了暫存區,準備提交,但是,我們後面又進行了第二次修改,這次的修改沒有放到暫存區中,所以,git commit 只負責把暫存區的修改提交了,也就是第一次修改被提交了,但是,第二次的修改沒有放到暫存區中,所以沒有被提交。
提交後,使用 git diff HEAD -- readme.txt 命令檢視工作區和版本庫裡面最新版本的區別:
怎麼提交第二次的修改呢,繼續使用 git add 然後再 git commit就可以。
小結:在Git中每次修改,如果不用git add
到暫存區,那就不會加入到commit
中()
撤銷修改
場景1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
。
場景2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD <file>
,就回到了場景1,第二步按場景1操作(git checkout -- file)。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,那就需要版本回退了,不過前提是沒有推送到遠端庫。
撤銷操作比較簡單,操作的時候,檢視git狀態,裡面會有對應的提示。。。
刪除檔案
在Git中,刪除也是一個修改的操作,這裡我們先新增一個test1.txt檔案,並且提交到Git;
一般情況下,我們會直接在資料夾中將沒用的檔案刪除,或者使用 rm 命令刪除:
這個時候,Git是知道你刪除了檔案,因為工作區和版本庫不一樣了,使用git status可以檢視被刪除的是哪些檔案;現在有兩個選擇:確定要從版本庫中刪除該檔案,使用 git rm 刪除,然後 git commit 提交你做的事情。
這樣,檔案就從版本庫中刪除了。就兩步 git rm file --> git commit
(小提示:先手動刪除檔案,然後使用git rm <file>和git add<file>效果是一樣的。)
如果不小心刪錯了檔案,版本庫裡還有這個檔案,所以可以命令 git checkout -- file 很輕鬆地把誤刪的檔案恢復到最新版本:
git checkout 其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以還原
注意:
1,如果你用rm刪除的檔案,就相當於只刪除了工作區的檔案,如果需要恢復,直接使用 git chekout -- file就可以:
2,如果你用的是git rm刪除檔案,那就相當於不僅刪除了檔案,而且還新增到了暫存區,需要先 git reset HEAD <file>,然後再git checkout -- <file>,如下圖操作所示