git操作中clean
和rm
是比較容易混淆的兩個操作,本文介紹它們之間的區別及使用場景。
git clean
git clean
操作針對的是當前倉庫中未被跟蹤的文件,即未通過git add
操作過的文件。
常用操作方式
當我們需要剔除倉庫中誤添加的文件、中間過程生成的文件時,可以這樣做:
# 1. git clean -n 看一下將要刪除的文件是哪些
$ git clean -n ./
# 2. git clean -f 如果確定執行刪除動作
$ git clean -f ./
# 2. 或使用 git clean -i 自己決定要刪除的文件
$ git clean -i ./
上面的命令後面都跟上./
,其實這就是當前路徑的意思,但git clean
默認情況下的查找就是從當前路徑往下“遞歸”進行的,那爲什麼我們還在這裏畫蛇添足地帶上./
呢?實際上,這裏說的“遞歸”是不完整的,因爲它不會對未跟蹤的文件夾進行處理,看下例:
.
├── tracked_file_1
├── tracked_file_2
├── untracked_file_1
├── untracked_dir_1
├── tracked_dir_1
│ ├── tracked_dir_10
│ ├── tracked_dir_11
│ ├── untracked_dir_10
│ │ ├── untracked_file_100
如果在當前頂層目錄直接使用git clean -n
查看將要被刪除的文件,會有如下結果:
Would remove untracked_file_1
然後如果直接使用git clean -f
對於untracked_dir_1、untracked_dir_10、untracked_file_100也是無動於衷的,這時就可以像上面那樣在後面跟上路徑,下面是使用git clean -n ./
查看將要被刪除的文件的結果:
Would remove untracked_file_1
Would remove untracked_dir_1/
Would remove tracked_dir_1/untracked_dir_10/
確認後使用git clean -f ./
就能夠將這些文件/文件夾都刪除了。
實際上,使用
git clean -dn
和git clean -df
也能達到一樣的效果,兩種方式可根據喜好選擇其一。
git rm
git rm
針對的一定是被跟蹤的文件,它對未被跟蹤的文件束手無策,這是與git clean
的本質區別。使用git rm
可以將文件從暫存區及版本庫中刪除。
常用場景
1.如果誤將未被跟蹤的文件添加到暫存區,想要撤銷此動作:
# 如果想要保留文件,僅是從暫存區刪除
$ git rm --cached mistake_tracked_file
# 如果想要從暫存區刪除,同時刪除文件
$ git rm -f mistake_tracked_file
2.如果想要刪除已存在版本庫的文件:
$ git rm -f useless_file
這種情況下是能夠直接進行git commit
操作的,其實相當於使用了rm
命令刪除文件後,再執行了一次git add
操作。
總結
可以看到git clean
操作其實更像純粹的rm
命令,但能夠方便地刪除未跟蹤文件。而git rm
操作更像是rm + git add
的合集,但其操作的對象是已跟蹤文件。