git revert
1 區別
? 常規的 commit (使用 git commit 提交的 commit)
? merge commit
2 首先構建場景
master上的代碼
dev開發分支上,添加一個a標簽,并commit這次提交
切到master上,再次進行改動和提交
將dev的代碼合到master后,當前的分支圖如下所示:
merge commit 和普通 commit 的不同之處在于:
merge commit 包含兩個 parent commit,代表該 merge commit 是從這兩個 commit 合并過來的
使用 git log 查看歷史提交記錄
也可以使用git show查看這個merge的詳細信息
這代表該 merge commit 是從 81eb85d 和 eod12f6 兩個 commit 合并過來的
而常規的 commit 則沒有 Merge 行
3 revert 常規 commit
使用 git revert 即可(commit id是希望刪除的Commit ID值)
git 會生成一個新的 commit,會將將定的 commit 內容從當前分支上撤除。
4 revert merge commit
但如果直接使用 git revert ,git 也不知道到底要撤除哪一條分支上的內容
這時需要指定一個"主線",主線的內容將會保留,而另一條分支的內容將被 revert
從前面git show的命令中,可以看到,merge commit 的 parent 分別為
? 81eb85d(代表master分支)
? eod12f6(代表dev分支)
我們需要保留master分支的內容(主線),將dev分支的內容移除,操作如下:
git revert -m <主線> <commit ID>
git revert -m 1 c0702d261f7be5e93d1b6646d91bec9dabde2a19
因為左邊的第一個(81eb85d)式主線,所以,主線為1
代碼去掉了上次合并內容:
分支圖如下:
5 revert之后的重新合并
假設A在自己分支dev上開發功能,并合并到了master,之后 master 上又提交了一個修改 g,這時提交歷史如下:
突然大家發現A的分支存在嚴重的bug,需要revert掉,于是就把這次合并revert掉了,記為H
然后A回到自己的分支dev上,修改好了bug,直覺上只需要再次merge到master了就可以,像這樣
但是這不能得到期望的結果,這樣合并的結果,并不會包含 c、d的代碼,只有 i 的代碼 (因為 c 和 d 兩個提交曾經被丟棄過)
所以,如果想恢復整個dev分支 所做的修改,應該先把 H revert 掉:
其中 H" 是對 H 的 revert 操作生成的新 commit,把之前撤銷合并時丟棄的代碼恢復了回來,然后再 merge 佳怡的分支dev,就可以把解決 bug 寫的新代碼合并到 master 分支
6 git reset 和 git revert區別
revert | 再當前版本的基礎上新增一個版本,不影響以前的代碼 | 在版本四想要回退時![]() |
reset | 該命令會強行覆蓋當前版本和要回退的版本之間的其他版本(不太建議) | 在版本四想要回退時![]() |
希望去掉最新的一次commit
分支圖如下,
git log 查看歷史記錄
執行:git reset a7961ff9760e49e5736f7b43794f44ed18b09ce5
從分支圖上,可以看到最新的commit記錄會被強行覆蓋而失去了
上一次修改的內容,會變成待提交的狀態