『現學現忘』Git基礎 — 35、Git中刪除檔案

2022-10-18 18:02:37

1、刪除檔案說明

在Git工作目錄中要刪除某個檔案,首先要清楚該檔案所處的狀態。

若要是該檔案未被Git管理,在工作區直接進行刪除即可。(不演示)

但是,若該檔案已經經過多次git addgit commit操作後,就必須要從已跟蹤檔案清單中刪除(確切地說,是在暫存區中刪除),然後提交。

可以用git rm命令完成此項工作,並連帶從工作目錄中刪除指定的檔案,這樣檔案之後就不會出現在未跟蹤檔案清單中了。

2、刪除檔案操作

(1)僅刪除暫存區的檔案

1)建立檔案,提交到版本庫

# 1.建立delete.html檔案
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "delete file test" >> delete.html

# 2.把delete.html檔案提交到本地版本庫中
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git add delete.html
warning: LF will be replaced by CRLF in delete.html.
The file will have its original line endings in your working directory

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git commit -m '新增delete.html檔案'
[master 262df2c] 新增delete.html檔案
 1 file changed, 1 insertion(+)
 create mode 100644 delete.html
 
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean

2)檢視暫存區和本地版本庫中的檔案列表

# 1.檢視暫存區中的檔案列表
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git ls-files
delete.html
readme.txt

# 2.檢視本地版本庫中的檔案列表
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git ls-files --with-tree=HEAD
delete.html
readme.txt

我們可以看到暫存區和本地版本庫中都是delete.htmlreadme.txt兩個檔案。

說明命令:git ls-files --with-tree=HEAD

該命令實際上檢視的是,當前工作分支上,HEAD指標所指向的,時間節點中的檔案列表。若檢視上一個時間節點中的檔案列表,則可將HEAD替換為HEAD^,當然也可以使用HEAD~n

3)僅刪除暫存區中delete.html檔案

使用git rm --cached命令,該命令可以僅刪除暫存區中的指定檔案。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git rm --cached delete.html
rm 'delete.html'

4)再次檢視暫存區和本地版本庫中的檔案列表

# 1.檢視暫存區中的檔案列表
$ git ls-files
readme.txt

# 2.檢視本地版本庫中的檔案列表
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git ls-files --with-tree=HEAD
delete.html
readme.txt

我們可以看到暫存區中已經沒有了delete.html檔案,但本地版本庫中還存在。

此時,通過git commit命令進行提交,可以將本地庫中的檔案檔案也刪除。

5)恢復被刪除delete.html檔案

此時工作區中的delete.html檔案還沒有被刪除,如下:

# 也可以使用ll命令檢視
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    delete.html	# 已刪除

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        delete.html	# 未被追蹤

此時最簡單的恢復方式是,將delete.html檔案git add到暫存區,再git commit提交到本地版本庫中。(我的理解是,把delete.html檔案新增到暫存區,這一步就讓delete.html檔案恢復了,因為此時工作區,暫存區,版本庫中的delete.html檔案都是一樣的。在執行git commit提交,也沒有什麼意思了。大家可以自己也思考一下。)

下面我們使用git reset命令進行恢復。

執行命令git reset HEAD,即執行的完全命令為git reset --mixed HEAD

# 1.版本回退
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git reset HEAD

# 2.檢視暫存區中的檔案列表
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git ls-files
delete.html
readme.txt

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean

可以看到暫存區中的delete.html檔案已恢復。

(2)完全刪除檔案

所謂完全刪除檔案,指的是將工作區、暫存區和本地庫中的指定檔案一次性都刪除。

1)刪除delete.html檔案

使用命令git rm filename

# 接上面範例
# 1.完全刪除delete.html檔案
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git rm delete.html
rm 'delete.html'

# 2.檢視暫存區中的檔案列表
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git ls-files
readme.txt

# 3.檢視本地版本庫中的檔案列表
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git ls-files --with-tree=HEAD
delete.html
readme.txt

# 4.檢視工作區中的檔案列表
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ ll
total 1
-rw-r--r-- 1 L 197121 80  4月 15 17:34 readme.txt

# 5.檢視工作目錄中的檔案狀態
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    delete.html

我們可以工作區和暫存區中的delete.html檔案都已經被刪除,但是本地版本庫中的delete.html檔案還存在。

我們檢視了當前工作目錄中的檔案狀態,發現delete.html檔案是已刪除狀態。

因此若要將本地版本庫中的delete.html檔案刪除,直接commit提交即可。

# 提交操作
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git commit -m '刪除 delete.html檔案'
[master fdcb771] 刪除 delete.html檔案
 1 file changed, 1 deletion(-)
 delete mode 100644 delete.html

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean

# 檢視工作目錄檔案
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ ll
total 1
-rw-r--r-- 1 L 197121 80  4月 15 17:34 readme.txt

說明delete.html檔案已經被徹底刪除了。

3、本文用到的命令總結

  • git ls-files:檢視暫存區中的檔案列表。
  • git ls-files --with-tree=HEAD:檢視本地版本庫中的檔案列表。(文中有使用說明)
  • git rm --cached filename:僅刪除暫存區中的檔案。
  • git rm filename:刪除工作區和暫存區的檔案。