使用Git的一大好處就是,當我的程式在改動的過程中發生了難以修復的錯誤,我們可以透過版本回推來還原。承接上一章節,我們先來建立多個commit。
輸入git log --gragh
如上圖,我們新提交了3個commit,分別是新增修改1、新增修改2、把修改1改成修改3。HEAD->MASTER
代表我們MASTER HEAD目前處於最新的"修改1變成修改3"的commit下。
就像是在一篇文章講的,我們在修改、commit有分為三大區塊:工作區、緩衝區、歸檔區。因此我們回推也可以選擇回推不同的程度。下達git reset <不同回推程度> <哈希(前七碼)>
即可進行回推。
(哈希可由reflog查看)
git reset --soft <哈希>
# 還原commit (但還是有被add)
# --soft只回原歸檔區
git reset --mixed <哈希>
# 然後查看git log 會發現之前提交的消失了
# 但是程式碼沒有變動(尚未回滾)
# --mixed 是同時對歸檔區與緩衝區做回滾。
# 所以此時modify尚未add
git reset --hard <哈希>
# 還原commit全部,包含程式碼
# --hard還原歸檔區、緩衝區、工作區
soft、mixed、hard分別代表三種不同的回推程度。具體可以看下圖:
實際來下達git reset --mixed f81792d
(回到修改二),可以看到程式還原到尚未add的狀態。
git revert <哈希>
同樣的能夠回復程式,但是邏輯不太一樣。來實際git revert f81792d(修改二)
,這樣就會把修改二的東西都回推掉,類似hard模式。
回朔的邏輯是用一個新的commit來去覆蓋之前的修改
revert可以用在修改前輩的程式上,想要回推前輩的東西,但是又不敢亂來。利用revert可以保留前輩之前的commit。不過基本上不常用啦,如果真的要保留,應該要用checkout一個新的分支,不過這個我們就保留到明天說吧。