2014年8月11日 星期一

git 如何把 merge 而且已經 push 的 branch 給回復


這一篇在說明如何把不小心 merge 而且已 push 的 branch 給回復。如果你 在 master 已 merge 但還沒 push ,請直接 git reset --hard HEAD^ 並略過本篇,如果你已經 push 了,看這篇就對了。網路上作法很多,而且很難,而這是我們的作法。由於團隊人數也不多,所以只用簡單的 git 分支架構。平常開發都是從 master 開一個新的 branch,開發完畢,再把那個 branch merge 回去 master。merge 回去都是這樣子,假設 branch 叫作 issue#869,那 merge 回 master 則是:
git checkout master
git merge issue#869 --no-ff

加上 --no-ff 就是說,如果 issue#869 那邊有 10 個 commit ,在 master 看起來就只會有一個 commit 。然而接下來通常是 push 到 github 上:
git push origin master
這是後才發現,完了!有個東西沒做完,或是沒改到,master 想要回去,怎麼辦?
在 master 的 git log 是
commit c939d884bf959d91c212b5c191b7d6d9bc7b353a
Merge: 48b8502 1d7a85d
Date:   Fri Aug 8 16:48:06 2014 +0800
    Merge branch 'issue#869' 
commit 48b850222960a4e4cbb0a00c6dfc4ec00446e66b
Date:   Fri Aug 8 16:28:15 2014 +0800
    #871 bucket20 force on
在 master 最新的 --no-ff merge 是 c939d884bf959d91c212b5c191b7d6d9bc7b353a
那就 revert 這一個
git checkout master
git revert -m 1 c939d884bf959d91c212b5c191b7d6d9bc7b353a
然後 master 就回去了,可以把 github 上的給復原
git push origin master
master 經過兩次的大 merge 和 unmerge ,master 回到 merge 前狀態了。但 branch 也要回覆到原本「已修改」的狀態。
# 切回 branch
git checkout issue#869
# 把 msater merge 回來,已免這個 branch 之後會有問題
git merge master
# 把 master 上的那一個修改,cherry-pick 回這個 branch
git cherry-pick -m 1 c939d884bf959d91c212b5c191b7d6d9bc7b353a

這樣子,branch 又會回覆到原本「已修改」的狀態。
沒問題就可以先推回 github
git push origin issue#869

這個作法相較之下,(個人覺得)比較簡單。