對于刪除操作卡者,git中有兩條命令蒿囤,rm和git rm,都可以刪除工作區(qū)中的文件崇决,但是刪除的方式還是不一樣蟋软,今天我們主要探討兩個問題:
1 、這兩條命令有什么區(qū)別嗽桩?
2、使用這兩條命令刪除文件后發(fā)現誤刪除了凄敢,該如何進行恢復呢碌冶?
為了更好的理解這兩個問題,我們先回顧一下有關工作區(qū)涝缝、暫存區(qū)的概念扑庞。
工作區(qū)(Working Directory)
就是你在電腦里能看到的目錄,比如我的testgit文件夾就是一個工作區(qū)拒逮。
版本庫(Repository)
工作區(qū)有一個隱藏目錄.git罐氨,這個不算工作區(qū),而是Git的版本庫滩援。
Git的版本庫里存了很多東西栅隐,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支master玩徊,以及指向master的一個指針叫HEAD租悄。
我們把文件往Git版本庫里添加的時候,是分兩步執(zhí)行的:
第一步:用git add把文件添加進去恩袱,實際上就是把文件修改添加到暫存區(qū)泣棋;
第二步:用git commit提交更改,實際上就是把暫存區(qū)的所有內容提交到當前分支畔塔。
一句話理解就是把需要提交的文件修改統(tǒng)統(tǒng)放到暫存區(qū)潭辈,然后一次性提交暫存區(qū)的所有修改。
回到最初的兩個問題:rm 和 git rm 命令的區(qū)別以及誤刪之后如何恢復澈吨?
在進行刪除實驗之前把敢,我們先創(chuàng)建一個test.txt文件到工作區(qū)gittest文件夾,然后添加到Repository中棚辽。
step1:在gittest文件夾下新建文本文件test.txt(前提是gittest已經設置為git可以管理的倉庫)
step2:git add:把文件添加到暫存區(qū)
step3:git commit:把暫存區(qū)的文件修改提交到當前分支master
1.使用rm命令刪除test.txt
命令:rm test.txt
然后工作區(qū)的test.txt果然被刪除了技竟。
使用命令:git status 查看操作結果。
發(fā)現 Changes not staged for commit: 這句話的意思是rm test.txt這個刪除操作刪除了工作區(qū)的test.txt文件屈藐,但是并沒有添加到暫存區(qū)榔组。對于沒有添加到暫存區(qū)的刪除操作熙尉,我們如何恢復文件呢?答案就在git status 下的提示信息:use git checkout -- test.txt 撤銷工作區(qū)的刪除操作搓扯。
運行 git checkout -- test.txt發(fā)現test.txt文件又恢復了检痰。
2.使用git rm 命令刪除test.txt
運行 git rm test.txt
運行 git status
發(fā)現test.txt文件被刪除。
根據git status 的提示信息:Changes to be commited锨推,這句話的意思是刪除操作已經放到暫存區(qū)铅歼,等待提交到分支。而比較前面rm 刪除操作并沒有提交到暫存區(qū)换可。那么對于提交到暫存區(qū)的刪除操作如何恢復文件呢椎椰?
兩步:
step1:命令:git reset head test.txt 可以把暫存區(qū)的修改撤銷掉
git status 查看操作結果發(fā)現 Changes not staged for commit,意思是暫存區(qū)的刪除操作已經撤銷。但是這一步文件還沒有恢復喲沾鳄。
step2: 命令:git checkout -- test.txt 可以工作區(qū)的修改撤銷掉
這時候文件才真正的恢復了慨飘。
總結:
1:rm 和 git rm命令都可以刪除工作區(qū)文件,但是rm不會將修改提交到暫存區(qū)译荞,所以恢復時只需要使用命令git checkout -- test.txt撤銷工作區(qū)的刪除即可瓤的。
2:git rm 會把刪除提交到暫存區(qū),所以恢復文件需要兩步吞歼,先使用命令git reset head test.txt 撤銷暫存區(qū)操作圈膏,再使用命令git checkout -- test.txt撤銷工作區(qū)的刪除即可。
3:$ git checkout -- file
這個命令可以讓我們丟棄工作區(qū)的修改篙骡,如:
$ git checkout -- test.txt
這個的意思就是把test.txt文件在工作區(qū)的修改撤銷稽坤。
4:假如現在你沒有提交commit,但是已經git add加入到了暫存區(qū)医增,當你的文件需要撤銷時慎皱,這時Git提供了一個命令
git reset HEAD file
用命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉。