git命令——git rm、git mv

git rmgit

git rm命令官方解釋shell

刪除的本質安全

在git中刪除一個文件,本質上是從tracked files中移除對這些文件的跟蹤。更具體地說,就是將這些文件從staging area移除。而後commit。ide

做用工具

git rm的做用就是將文件從暫存區刪除spa

git rm的做用就是將文件從工做目錄 和 暫存區 刪除。3d

git rm並不能僅僅刪除工做目錄中的文件,而暫存區保持不變。目前git也沒有提供任何參數支持這一功能。要想實現這一目標,只能使用Linux自帶的/bin/rm命令code

使用場景blog

完全刪除文件rem

所謂完全刪除文件,就是在工做目錄和暫存區刪除文件。因爲gir rm不能直接刪除工做目錄中的文件,因而使用/bin/rm手動刪除。此時執行git status 時就會在 「Changes not staged for commit」部分看到,表示沒有被更改沒有被暫存

$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
    (use "git add/rm <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in workingdirectory)
        deleted: PROJECTS.md
no changes added to commit (use "git add" and/or "git commit -a")
View Code

而後再運行 git rm 將文件從暫存區移除

$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)
        deleted: PROJECTS.md
View Code

下一次提交時,該文件就再也不歸入版本管理了。 

如今假設這樣一組場景,有文件file1.c,file2.c,file3.c。我把file1.c作了修改,而且git add到暫存區。這時候若是向上面那樣手動/bin/rm刪除file1.c,而後再git rm file1.c,這樣沒有任何問題。可是若是你跳過/bin/rm file1.c這一步,直接git rm file1.c是不被容許的,報錯

$ git rm file1.c 
error: the following file has changes staged in the index:
    file1.c 
(use --cached to keep the file, or -f to force removal)
View Code

必需要用強制刪除選項 -f(即 force 的首字母)。 這是一種安全特性,用於防止誤刪尚未添加到快照的數據,這樣的數據不能被 Git 恢復。

只刪除暫存區的文件

若是你想保留工做目錄中的文件,可是刪除對應暫存區中的文件。換句話說,你想讓這些保存在磁盤上的文件再也不被git跟蹤。請使用--cached 選項。爲啥會有這種奇怪的需求呢?假設這樣一種場景,你忘記了添加.gitignore文件,不當心把不少本應忽略的文件加到了暫存區,這時候就須要這裏介紹的作法了。

$ git rm --cached README

git rm 命令後面能夠列出文件或者目錄的名字,也可使用 glob 模式。 比方說:

$ git rm log/\*.log

注意到星號 * 以前的反斜槓 \, 由於 Git 有它本身的文件模式擴展匹配方式,因此咱們不用 shell 來幫忙展開。

此命令刪除 log/ 目錄下擴展名爲 .log 的全部文件。 相似的好比:

$ git rm \*~

該命令爲刪除以 ~ 結尾的全部文件。

git mv

不像其它的 VCS 系統,Git 並不顯式跟蹤文件移動操做。 若是在 Git 中重命名了某個文件,倉庫中存儲的元數據並不會體現出這是一次更名操做。 不過 Git 很是聰明,它會推斷出究竟發生了什麼。

你依然可使用$ git mv file_from file_to 對文件更名。它會恰如預期般正常工做。 實際上,即使此時查看狀態信息,也會明白無誤地看到關於重命名操做的說明:

$ git mv README.md README
$ git status
On branch master
Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)
        renamed: README.md -> README        
View Code

事實上,運行 git mv 就至關於運行了下面三條命令:

$ mv README.md README
$ git rm README.md
$ git add README
View Code

如此分開操做,Git 也會意識到這是一次更名,因此無論何種方式結果都同樣。 二者惟一的區別是,mv 是一條命令而另外一種方式須要三條命令,直接用 git mv 輕便得多。 不過有時候用其餘工具批處理更名的話,要記得在提交前刪除老的文件名,再添加新的文件名。

相關文章
相關標籤/搜索