解決Git Revert操作後再次Merge代碼被沖掉的問題:

git reset & git revert 區別

1. git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。 
2. 在回滾這一操作上看,效果差不多。但是在日後繼續merge以前的老版本時有區別。因爲git revert是用一次逆向的commit“中和”之前的提交,因此日後合併老的branch時,導致這部分改變不會再次出現,但是git reset是之間把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應該還會被引入。 
3. git reset 是把HEAD向後移動了一下,而git revert是HEAD繼續前進,只是新的commit的內容和要revert的內容正好相反,能夠抵消要被revert的內容。

git revert fcd8a10 -m 1 #撤回提交的commit id:fcd8a10 1代表當前分支  2代表在當前分支 merge的分支

要解決這個問題,需要把revert產生的提交再revert一次
因爲git revert是用新提交覆蓋舊提交,因此,被覆蓋的提交等於不會被採用了。如果兩個分支(假設是master和A分支)先合併再用revert回滾,之後又合併(A合併到master),就會發現在master分支上,A分支第一次合併之前的修改大部分不見了。這是因爲從時間的發生順序來看,A分支第一次合併之前的修改發生在revert之前,revert發生在後,而 revert拋棄了A第一合併之前的修改,那麼再合併Git就認爲你永遠拋棄了A第一次之前的修改。
1) git merge topic(當前head指向master分支)
2) git reset --hard HEAD~ 如下圖(如果其它人M有改動就會丟失)
3)git revert -m 1 HEAD(反向提交)

新的提交 ^M 與 C6 有完全一樣的內容,所以從這兒開始就像合併從未發生過除了“現在還沒合併”的提交依然在 HEAD 的歷史中。 如果你嘗試再次合併 topic  master Git 會感到困惑:

$ git merge topic
Already up-to-date.
topic 中並沒有東西不能從 master 中追蹤到達。 更糟的是,如果你在 topic 中增加工作然後再次合併,Git 只會引入被還原的合併 之後 的修改。

Figure 141. 含有壞掉合併的歷史

解決這個最好的方式是撤消還原原始的合併,因爲現在你想要引入被還原出去的修改,然後 創建一個新的合併提交:

$ git revert ^M
[master 09f0126] Revert "Revert "Merge branch 'topic'""
$ git merge topic
undomerge-revert3.png
Figure 142. 在重新合併一個還原合併後的歷史

在本例中,M  ^M 抵消了。 ^^M 事實上合併入了 C3  C4 的修改,C8 合併了 C7 的修改,所以現在 topic 已經完全被合併了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章