實踐場景
場景1 回退提交
在日常工作中,我們可能會和多個同事在同一個分支進行開發,有時候我們可能會出現一些錯誤提交,這些錯誤提交如果想撤銷,可以有兩種解決辦法:回退( reset )、反做(revert)
keywords:reset、revert、reflog
回退 git reset
reset 操作就是修改 HEAD 指向的位置,將 HEAD 當前指向的位置回退到指定的某個版本,例如針對某個分支我們提交了三次(如圖所示),這是 reset 之前的三個 commit 記錄,目前 HEAD 指向的是 commit 3的位置,如果我們想把代碼回退到 commit 1的位置,怎么操作呢?
git reset --hard 'commit 1 的提交id'
操作完之后 commit 2和 commit 3 的提交記錄就沒有了,直接回退到了commit 1。注意區分兩個參數:hard& soft
- –hard 直接回退
- –soft 軟回退
soft只回退了commit 的信息,但是內容不會消失,工作區的文件內容都還在。如果還要提交,直接 commit 即可。這種操作的友好性就是如果我們本身只是想把commit的操作給回退,但是不想還原內容,保持所有內容都還在,這種操作就很合適,保證了代碼不會丟失。
重做/反做 git revert
git revert是用于“反做”某一個版本,以達到撤銷該版本的修改的目的。比如,我們commit了三個版本(版本一、版本二、 版本三),突然發現版本二不行(如:有bug),想要撤銷版本二,但又不想影響撤銷版本三的提交,就可以用 git revert 命令來反做版本二,生成新的版本四,這個版本四里會保留版本三的東西,但撤銷了版本二的東西。如下圖所示:
反做前:
git revert -n 'commit 2 的提交id'
git commit -m 'test4'
反做后:
找回reset和revert的記錄 git reflog
如何找回因回退或反做而消失的commit記錄?上述兩種操作會造成有些 commit 記錄消失,但是如果自己又后悔了,想找回來,我們該怎么操作呢?可以使用reflog查看所有分支的所有操作記錄(包括已經被刪除的 commit 記錄和 reset 的操作)
git reflog
faa135e HEAD@{0}: commit: test3
783ef0a HEAD@{1}: commit: test2
2288ba8 HEAD@{2}: commit: test1
abddace HEAD@{3}: commit: test3
30df387 HEAD@{4}: commit: test3
參考資料
- Git 版本回退(實際工作中基本都會遇到) - 掘金
- yuque.GIT實踐與常用命令