1. 程式人生 > >管理修改、撤銷修改git checkout -- <file>、刪除檔案git rm <file>(七)

管理修改、撤銷修改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

。如:第一次修改-->第二次修改--> 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(版本號) ,可以回退到上一個版本。不過,這是有條件的,就是你還沒有把自己的本地版本庫推送到遠端倉庫。

小結:

  1. 當你改亂了工作區某個檔案的內容,想直接撤銷工作區修改時,可以使用命令 git checkout -- <file>
  2. 不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想撤銷修改,操作如下:

                    分兩步:① 先 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 ;