觀念
不管是刪除檔案或更改檔名,對 git 來說就是一種更改紀錄而已。
刪檔
平常我們在工作目錄下運作,通常是使用檔案管理之類的程式來處理檔案。
例如按 delete 或利用快顯功能表的刪除都可以,甚至是 shift+delete 的強制刪除也行。
但我這邊選擇用指令在 git bash 下刪檔,目的是讓大家可以知道我做了什麼事,不然平常是不需要特別開 git bash 刪檔的。
$ rm welcome.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: welcome.txt
no changes added to commit (use "git add" and/or "git commit -a")
從上面的資訊我們至少看出兩點:
- welcome.txt 上面有 deleted 標誌,表示他被刪了
- Changes not staged for commit 表示現在的 git 狀態是做了變更但還沒 add 到暫存區,當然也就還沒 commit 了
那就把他加到暫存區吧
$ git add .
# 接著觀察一下狀態
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: welcome.txt
從上面的資訊我們至少看出兩點:
- welcome.txt 上面有 deleted 標誌,表示他被刪了
- Changes to be committed 表示目前 git 的狀態是已經加到暫存區但還沒 commit 推進倉庫
如果使用 git rm welcome.txt
就是把刪除跟 add 的兩個動作合成一個指令,
實務上很少用,因為我們比較不會在 git bash 下刪檔。
如果使用 --cached
也就是刪除時加上這個參數,
其實不是刪檔,而是移除這個檔案的 git 追蹤,意思就是 git 以後不會再控管他了。
移除追蹤後得到的狀態長這樣:
$ git rm welcome.txt --cached
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: welcome.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
welcome.txt
那個 Untracked files
就表示這個檔案已經停止追蹤了。
以上這個 --cached
參數操作我們假設是在其他地方做的不影響原本的工作目錄。
那我們把剛剛刪好檔案的部分 commit 提交上去吧
$ git commit -m '刪除 welcome.txt'
[master c708443] 刪除 welcome.txt
1 file changed, 2 deletions(-)
delete mode 100644 welcome.txt
# 看一下 log
$ git log -1
commit c708443e21e8fba120ad1437ebc17a3562315559 (HEAD -> master)
Author: Logo Kuo <logo@forblind.org.tw>
Date: Sun Feb 23 21:51:47 2020 +0800
刪除 welcome.txt
參數 -1
就是只列出最新的一筆 log 資訊。
在這裡讓我們先回到過去還沒刪除 welcome.txt 的美好時光吧,因為我們還沒練習改名。
回春指令之後再解釋,因為我們先把重點放在刪檔與更名上。
$ git reset --hard HEAD~
HEAD is now at 462682d 沒東西
$ git log -1
commit 462682ddf12ddebd3e7b4c6796ffb0907560f08b (HEAD -> master)
Author: Logo Kuo <logo@forblind.org.tw>
Date: Sun Feb 16 13:34:36 2020 +0800
沒東西
$ ls
welcome.txt
真神奇,剛剛的刪除 commit 紀錄不見了,檔案也回來了。目前先理解成紀錄消失就表示沒做過該紀錄的所有動作。
更名
跟上面刪檔一樣,可以用檔案總管的快顯功能表或快速鍵 F2 來變更檔名,
那我們還是先用指令來更名讓大家看得到動作:
$ mv welcome.txt hello.txt
# 當然還是要看一下狀態
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: welcome.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
雖然是更名,但對 git 來說其實是兩個動作,也就是刪除 welcome.txt 並新增 hello.txt
而且新的檔案狀態是還沒被追蹤。
$ git add .
# 剛開始使用 git 最好做每個動作都仔細觀察狀態,這樣我們才知道 git 到底做了什麼
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: welcome.txt -> hello.txt
git 很聰明吧,知道這只是 renamed
更名動作而已。
當然 git mv welcome.txt hello.txt
也可以合併兩段式指令為一個指令了。
記得要 commit 提交才算是完成整個操作流程喔。
不想改名的話就再改回來再提交囉。