Git 復原一個已經 push 至遠端主機的 merge

雖然很少碰到需要復原一個已經 push 至遠端主機的某次合併分支的操作,但還是紀錄一下....

問題描述

有一次,在 merge 另一個分支之前,我忘了先做 git pull。那個分支是別人寫的,而且包含錯誤的程式碼,姑且叫它 branch-1。雖然對方後來修正了這個錯誤,並且又再 commit 和 push 了一個新版本,但我在自己機器上進行 git merge 時,合併的是先前那個包含錯誤程式碼的版本。

而且,我在合併 branch-1 之後並沒有立刻發現這個狀況,於是繼續以這次合併的結果為基礎來修改程式。改完後,我將這次的修改 push 到遠端主機。過一會兒之後,因為 build server 發出建置失敗的錯誤訊息,才知道我先前合併的分支是有問題的。

我決定復原這次合併的結果,回到合併前的狀態,然後再去合併 branch-1 的最新版本。

然而,使用 git recover [commit_hash] 來復原時,git 告訴我必須使用 "-m" 參數來指出父層的 commit number。但我怎麼知道要使用哪一個 commit number  呢?

解決方法

參考 stackoverflow.com 的這帖:How to revert a merge commit that's already pushed to remote branch?

只要按照其中描述的步驟去做,便可解決。

裡面有解釋,由於那一次的 merge commit 有多個 parent,導致 git 無法決定要用哪一個 parent 來復原,所以必須由我們提供這個 parent commit number。

透過 git log 指令,它會顯示這次 merge commit 的 parent 有哪些,而我們就可以根據這些 commit numbers 來判斷該用哪一個——這部分乍看有點 tricky,但除了我們自己,也沒有別人能夠幫我們判斷了。

(給自己看的,就這樣簡略寫一下了。)




Post Comments

技術提供:Blogger.