今天我們來學習 Rollback,當我們在使用 Git Commit 指令的時候,有可能「發現一些錯誤」或「後悔了」,想要撤回,就可以使用 Git Reset 這一個指令,但這一個指令很多人常常搞不清楚參數 hard / soft / mixed 的差異,以下,我們一樣透過實作練習的方式來學習這三個參數的差異。
■ git reset ( hard / soft )
如果我們 Commit 之後,我們可以透過 git log 去查詢 Commit 記錄,其中最新的那一筆會出現〝 HEAD -> master〞的字眼,如下圖所示:
HEAD -> master 是當前最新的一個 Commit
假設我們又新增 commit 了 demo.txt ,如下圖所示:
雖然我們可以透過 git diff 指令去看我們變更了哪些內容,一行一行去刪,但這個不太可行,所以可以透過 git reset –hard HEAD~ 指令去進行撤銷提交。
1 |
git reset --hard HEAD~ |
這時候我們再使用 git log 去查看,發現 demo commit 已經不見了,而檔案也已經還原回來
剛我們用的指令是 git reset –hard HEAD~ ,如果我們改用 soft 參數: git reset –soft HEAD~ ,那麼撤消一樣會成立,但檔案〝不會被還原〞,回到提交前的狀態 ( uncommit )。
1 |
git reset --softs HEAD~ |
如果我們使用 git reset HEAD ~ ,但不加參數,那麼那麼撤消一樣會成立,但檔案〝不會被還原〞,回到添加前的狀態 ( unadd )。
1 |
git reset HEAD~ |
若我們使用了 git reset HEAD ~,我們就必須再重新添加 ( gIt add ) 一次,但如果不想重新寫註解,可以使用 git commit -c ORIG_HEAD 指令,則會發現之前的 Commit 還在。
1 |
git commit -c ORIG_HEAD |
■ git reset 參數說明
- git reset –mixed
- 不加參數時,默認為 –mixed
- 撤回之後,還仍供二次修改的機會。[推薦]
- 狀態:撒回,但「文件不改變」,需重新 add 文件。
- git reset –hard
- 撤回之後,文件也直接回到最原始的狀態,較不推薦。
- 狀態:撒回且「文件重當初原始狀態」。
- git reset –soft
- 和 mixed 和 hard 處於中間狀態,撤回之後,自動 add 文件
- 狀態:撒回,但「文件不改變」,需重新 commit 文件。 ( 已 add 完成 )
■ Git Rollback
以上圖為例,我們希望退回 Rollback 的第一個,我們可以透過下面的方式進行:
// 透過〝哈希值〞直接指定哪一個
1 |
git reset ade3034d |
// 透過〝相對位置〞指定 ( 往前退 2 個位置 ),跟上述指令相同
1 |
git reset current~2 |
// 透過〝相對位置〞指定 ( 往前退 2 個位置 ),跟上述指令相同
1 |
git reset HEAD~2 |