管理修改、撤銷修改git checkout -- <file>、刪除檔案git rm <file>(七)
管理修改
目前你完全掌握了暫存區的概念,接下來,我們討論一下為什麼Git比其他版本控制系統設計得優秀,因為Git跟蹤並管理的是修改,而非檔案。什麼是修改?比如你新增了一行,這就是一個修改,刪除了一行,也是一個修改,更改了某些字元,也是一個修改,刪了一些又加了一些,也是一個修改,甚至建立一個新檔案,也算一個修改。
為什麼說Git管理的是修改,而不是檔案呢?我們接著實踐,第一步,對index.html做一個修改,比如加一行內容,如下:
然後,新增(git add 命令),如下:
接著,再一次修改檔案 index.html ,如下:(第二次修改)
再接下來,直接提交(命令:git commit -m <message> ),如下:
那麼,提交之後,檢視版本庫目前的狀態(命令 git status),如下:
由圖可知,第二次修改並沒有被提交,以上的整個操作過程如下:
第一次修改- -> git add - -> 第二次修改 - -> git commit ;
前面講了,Git管理的是修改,當你用 git add 命令後,在工作區的第一次修改被放入暫存區,準備提交,但是,在工作區的第二次修改並沒有放入暫存區,所以,git commit 只負責把暫存區的修改提交了,也就是第一次的修改被提交了,第二次的修改不會被提交。
提交後,用 git diff HEAD -- index.html 命令可以檢視工作區和版本庫裡面最新版本的區別:
由圖上可知,第二次修改並沒有被提交。
那怎麼提交第二次修改呢?
第1:你可以連續接著兩次修改後,一併使用命令 git add,再 git commit
第2:在第二次修改後,再次使用命令git add ,再 git commit 。如 第一次修改--> git add --> 第二次修改--> git add --> git commit ;
小結:
總而言之:每次修改,都必須要先使用新增命令 git add ,接著使用提交命令 git commit ;
撤銷修改
第一種情況:只是修改,沒有 git add 。
在緊急的工作中,難免會出現以下的錯誤,你在 index.html 中 添加了一行,如下:
在你準備提交前,猛然發現了stupid boss可能會讓你丟掉這個月的獎金!既然錯誤發現得很及時,就可以很容易地糾正它。你可以刪掉最後一行,手動把檔案恢復到上一個版本的狀態。 如果用命令 git status 檢視一下,如下:
由上圖發現,Git會告訴你,在use第二行 git checkout -- <file> 可以在工作區撤銷修改;
命令 git checkout -- index.html 意思就是,把index.html檔案在工作區的修改全部撤銷。這裡撤銷修改有兩種情況:
第1:index.html 檔案在工作區修改後,還沒有git add 新增到暫存區,現在,撤銷修改就回到工作區當時的狀態;
第2:index.html 檔案在工作區修改後,並且git add新增到暫存區,又作了修改;現在,撤銷修改就回到新增到暫存區後的狀態。
接下來,看看index.html 的檔案內容,如下:
檔案內容復原了。
命令git checkout -- file中的--很重要,沒有--,就變成了“切換到另一個分支”的命令,在後面分支管理中會再次遇到git checkout命令。
第二種情況:修改後,在 git add 了。
現在假定是凌晨3點,你不但寫了一些胡話,還 git add 到暫存區了,如下:(使用命令 cat )
慶幸的是,在 git commit 之前,你發現了這個問題。用git status檢視一下,修改只是新增到了暫存區,還沒有提交:
由上可知:Git 告訴我們,用命令 git reset HEAD <file> 可以把暫存區的修改撤銷掉(unstage),重新放回工作區,如下:
git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本。
再用 git status 檢視一下,現在暫存區是乾淨的,工作區有修改,如下:
由上圖發現,Git會告訴你,在use第二行 git checkout -- <file> 可以在工作區撤銷修改;
那麼現在,撤銷了修改,index.html檔案 的最後一行沒有了, 回到最初的樣子;
第三種情況:
現在,假設你不但改錯了東西,還從暫存區提交到了版本庫,怎麼辦呢?
操作過程:修改檔案 --> git add --> git commit ;
在第五篇有提到 :返回上一次修改的版本 git reset --hard commit-id(版本號) ,可以回退到上一個版本。不過,這是有條件的,就是你還沒有把自己的本地版本庫推送到遠端倉庫。
小結:
- 當你改亂了工作區某個檔案的內容,想直接撤銷工作區修改時,可以使用命令 git checkout -- <file> ;
- 不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想撤銷修改,操作如下:
分兩步:① 先 git reset HEAD <file> ,②接著使用命令 git checkout -- <file> ;
3. 不但改亂了工作區某個檔案的內容,還新增到了暫存區時,並且還提交 git commit 了。
想撤銷本次提交,只能使用命令 git reset --hard commit-id ,直接回退到上一個版本;前提是沒有推送到遠端庫。
刪除檔案
在Git中,刪除也是一個修改操作,實戰一下,先新增一個新檔案app.js到Git並且提交,如下:
一般情況下,①可以直接在資料夾下手動刪除該檔案,② 可以在命令視窗中輸入命令 rm 刪除,如下:
小提示:先手動刪除檔案,然後使用 git rm <file> 和 git add <file> 效果是一樣的。
這時,Git知道你刪除了檔案,因此,工作區和版本庫就不一致了,git status命令會立刻告訴你哪些檔案被刪除了(圖上)。
現在有兩個選擇:一是確實要從版本庫中刪除該檔案,那就用命令 git rm 刪掉,並且 git commit,如下:
另一個情況是:刪錯了檔案,別忘了,刪除也是修改操作,那麼既然刪錯了,那就執行撤銷操作,如下:
$ git checkout -- app2.js
命令 git checkout -- <file> ,無論工作區是修改還是刪除,都可以“一鍵還原”。
小結:
命令git rm用於刪除一個檔案。如果一個檔案已經被提交到版本庫,那麼你永遠不用擔心誤刪, 但是要小心,你只能恢復檔案到最新版本,你會丟失最近一次提交後你修改的內容。
轉自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 ;