刪除檔案
前篇(1)提到,若要退追蹤,可以使用
git rm --cached 'FILE_NAME'
裡面的--cached
表示要刪(rm)的是將tracked檔案刪改為untracked狀態
但不會真的刪掉本機檔案
假如沒加--cached
,就會真的刪本機檔案
git rm 'src/components/ui/ShouldDeleted.vue' //執行後會出現下面這行 rm 'src/components/ui/ShouldDeleted.vue'
此時的狀態為:git status
On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: src/components/ui/ShouldDeleted.vue
用rm的方法,會直接stage file,不須再透過git add 'FILE_NAME' stage一次
提交新的commit來commit此次的delete動作後,便完成刪除
如何還原?
先介紹git reset用法
$ git reset [<mode>] [<commit>]
先說明 [<mode>] ,<mode>預設值為 --mixed
--mixed
:會重置index( = staging area),但不會重置working tree( = working directory),改變HEAD位置至[<commit>],更動的檔案會被保留為更動後的狀態(Unstaged)。此時取消變更(例如git restore "FILE_NAME")便可將working tree還原至[<commit>]版本的狀態。
--soft
:不更動下指令時的index跟working tree,只改變HEAD位置至[<commit>],而其間有被更動的檔案會是Staged(呈現等待Commited的狀態),亦即leaves all your changed files "Changes to be committed". 當作移動HEAD用的~
--hard
:重置index跟working tree,改變HEAD位置至[<commit>],那些被tracked的檔案在此[<commit>]後所做的變動都會被捨棄。版本還原利器!
以--soft
為操作範例如下,被更動的檔案已經處於Staged且未Commited的狀態
git reset --soft 2fc9bad git status //顯示如下 On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: src/components/ui/ShouldDeleted.vue
如何查看操作紀錄?
常用有兩種,git reflog
和git log
git log
顯示當前提交(commit)紀錄,可加 --oneline
方便可閱讀,-n
設定顯示最新的n筆commit。
PS E:\前端學習\Vue Practice\project-find-a-coach> git log --oneline 2fc9bad (HEAD -> master) 再次嘗試刪除ShouldDeleted.vue 9a595aa add shouldDelete file 19fb8e5 modify Not found 0..0 1c31ab4 run git clean -df 49923eb test untrack bc9cc4f 退追蹤 7d66845 initial version
git reflog
檢視本地所有commit紀錄,包含變更,案Q可以離開檢視狀態----還原的救星!
PS E:\前端學習\Vue Practice\project-find-a-coach> git reflog -10 2fc9bad (HEAD -> master) HEAD@{0}: reset: moving to 2fc9bad 9a595aa HEAD@{1}: reset: moving to 9a595aa 97c1d77 HEAD@{2}: reset: moving to 97c1d77 c1a9ddc HEAD@{3}: reset: moving to c1a9ddc 9a595aa HEAD@{4}: reset: moving to 9a595aa 97c1d77 HEAD@{5}: reset: moving to 97c1d77 9a595aa HEAD@{6}: reset: moving to HEAD~2 97c1d77 HEAD@{7}: commit: 改notfound之後要來測試reset --hard 2fc9bad (HEAD -> master) HEAD@{8}: commit: 再次嘗試刪除ShouldDeleted.vue 9a595aa HEAD@{9}: reset: moving to 9a595aa
假設你開發到0.1.3版,覺得0.1.2版畫面比較好,reset回去0.1.2後,業主又說還是0.1.3的好看...
此時可使用git reflog
調出0.1.3的SHA-1 tag(英數混合的那串代碼)
再一次使用git reset --hard '目標tag'
便能還原回0.1.3版本
Note:把git reset當作是切換不同Commit的工具
--待續--