在 git 的世界裡面基本上沒有什麼救不回來的狀況,也就是後悔藥是有得買的。
在之前的章節中多少有提過,例如如何從 status 的狀態放棄,或者 add 加入暫存區的檔案如何排除,
以及已經 commit 的檔案如何修改等等。
這裡稍微整理各種狀況讓大家在出問題時可以先看看這兩篇,找尋你的後悔藥。
從暫存檔中移除
那如果已經加到暫存檔,也就是 add 進去了,有辦法後悔嗎?
當然沒問題,我們看一下目前暫存區的狀態
$ git status
On branch newnew
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: abc.txt
deleted: log.txt
new file: qqq/abc.txt
看起來就是修改又刪除了一些檔案,然後產生了一個新的資料夾及檔案,並且加到暫存區(stage)了,
由 git 給我們的資訊很簡單的發現,只要使用 git restore --staged 檔名
就可以。
$ git restore --staged abc.txt
$ git status
On branch newnew
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: log.txt
new file: qqq/abc.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: abc.txt
所以 abc.txt 已經從暫存區移出,如果想從 status 也還原,那就參考 上一篇 的教學吧。
我們先把 abc.txt 再次 add 進 stage 然後試看看用 .
能不能一次全部從 stage 移出:
$ git add abc.txt
$ git restore --staged .
$ git status
On branch newnew
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)
modified: abc.txt
deleted: log.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
qqq/
no changes added to commit (use "git add" and/or "git commit -a")
成功了,這個狀態應該要很熟悉,也就是類似回到上一篇的狀況。
但是,有沒有一種方法是可以直接從暫存區就直接恢復,而不是只退到工作目錄而已,
因為如果想直接還原到沒有動作,依上例就必須先從暫存區移回工作目錄,再由工作目錄還原到未更動的狀態。
當然我們可以把這兩篇的還原指令用 &&
連起來完成,不過這不是我們想要的方法。
大家可以回想一下 git 的架構,其實這個問題就是還原到上一次提交的狀態而已,
因為我們還沒有做新的 commit 所以只要回到上一個提交的狀態,後面的變化全部都會被取消。
$ git reset --hard HEAD
從 commit 中移除
這部分我們之前的基礎應用都講過了,例如添加 commit 的資訊,或改寫 commit 內容,
還有刪除、拆解、合併 commit 等等,這邊就不多說了。