git 回滚 add 操作_炫技!git 优雅回滚一次错误的合并操作!
相對于常規的 commit,當使用 git merge 合并兩個分支的時候,你會得到一個新的 merge commit。
當我們 git show 的時候會出現類似信息:
1commit?6dd0e2b9398ca8cd12bfd1faa1531d86dc41021a2Merge:?d24d3b4?11a7112
3Author:?test?
4...............
Merge: d24d3b4 11a7112 這行表明了兩個分支在合并時,所處的 parent 的版本線索。
比如在上述項目中我們開出了一個 dev 分支并做了一些操作,現在分支的樣子變成了這樣:
1init?->?v1?->?v2?->?v3??(master)2???????????\??????
3????????????d1?->?d2??(dev)
當我們在 dev 開發的差不多了:
1#git:(dev)2git?checkout?master?
3#git:(master)
4git?merge?dev
這個時候形成了一個 Merge Commit faulty merge:
1init?->?v1?->?v2?->?v3?--?faulty?merge??(master)2???????????\????????????/
3????????????d1??-->??d2??(dev)
此時 faulty merge 有兩個 parent 分別是 v3 和 d2。
回滾錯誤的合并這個 merge 之后還繼續在 dev 開發,另一波人也在從別的分支往 master 合并代碼。變成這樣:
1init?->?v1?->?v2?->?v3?--?faulty?merge?->?v4?->?vc3?(master)2????????\??\????????????/?????????????????????/
3?????????\??d1??-->??d2??-->?d3?-->?d4??(dev)/
4??????????\?????????????????????????????????/?
5???????????c1??-->??c2?-------------------c3?(other)
這個時候你發現, 妹的,上次那個 merge 好像給共享分支 master 引入了一個 bug。這個 bug 導致團隊其他同學跑不通測試,或者這是一個線上的 bug,如果不及時修復老板要罵街了。
這個時候第一想到的肯定是回滾代碼,但怎么回滾呢。用 reset?不現實,因為太流氓不說,還會把別人的代碼也干掉,所以只能用 revert。而 revert 它最初被設計出來就是干這個活的。
怎么操作呢?首先想到的是上面所說的 git revert ,但是貌似不太行。
1git?revert?faulty?merge2error:?Commit?faulty?merge?is?a?merge?but?no?-m?option?was?given.
3fatal:?revert?failed
這是因為試圖撤銷兩個分支的合并的時候 Git 不知道要保留哪一個分支上的修改。所以我們需要告訴 git 我們保留那個分支 m 或者 mainline。
1git?revert?-m?1?faulty?merge-m 后面帶的參數值可以是 1 或者 2,對應著 parent 的順序。
上面列子:1 代表 v3,2 代表 d2。
所以該操作會保留 master 分支的修改,而撤銷 dev 分支合并過來的修改。提交歷史變為:
1init?->?v1?->?v2?->?v3?--?faulty?merge?->?v4?->?vc3?->?rev3?(master)2??????????\????????????/?????????????????????
3???????????d1??-->??d2??-->?d3?-->?d4??(dev)
此處 rev3 是一個常規 commit,其內容包含了之前在 faulty merge 撤銷掉的 dev 合并過來的 commit 的(反操作)的合集。
到這個時候還沒完,我們要記住,因為我們拋棄過之前 dev 合并過來的 commit,下次 dev 再往 master 合并,之前拋棄過的其實是不包含在里面的。那怎么辦呢?
恢復之前的回滾很簡單,我們把之前 master 那個帶有反操作的 commit 給撤銷掉不就好了?
1git?checkout?master2git?revert?rev3
3git?merge?dev
此時提交歷史變成了:
1init?->?v1?->?v2?->?v3?--?faulty?merge?->?v4?->?vc3?->?rev3?->?rev3`?->?final?merge?(master)2??????????\????????????/???????????????????????????????????????????????/
3???????????d1??-->??d2??-->?d3?-->?d4??--------------------------------(dev)
你學會這個騷操作了嗎?評論區見!▼往期精彩回顧▼臥槽!Java 長整數的這個坑你踩過嗎?唉,因為 Java 的裝逼簡化炫技寫法背鍋了!
點擊左下角閱讀原文查看歷史經典技術問題匯總,看完順手走一波PYQ呀~
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的git 回滚 add 操作_炫技!git 优雅回滚一次错误的合并操作!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cannot open include
- 下一篇: LightOj 1078 Basic M