淺談git rebase和git checkout –ours(theirs)

kamushin233發表於2015-07-24

先描述下場景。
A在master基礎上建立了個新的branch fix_bug, 並在fix_bug上進行了1次對foo.py的修改並提交78d4c5。
B在master上直接進行了1次對foo.py的修改並提交4dd14b。
現在,AB兩人都使得他們自己的兩個branch向前推進了一步。
這時候C在master上,要把A的工作合併到master上來,他選擇了rebase。會發生什麼呢?

git checkout master
git rebase fix_bug

git是這麼處理rebase這件事情的,先把4dd14b撤銷掉,把它作為patch放進.git/rebase目錄,然後把master分支更新為最新的fix_bug分支,然後再把4dd14b這個patch打上來。
這時候會爆出衝突,打patch的時候發現foo.py這個檔案衝突了。
假設C說,我覺得A的工作是有意義的,我保留A的,放棄B的。他應該如何做呢?
git checkout給了我們2個可選引數,分別是--ours--theirs
第一反應下,我們會覺得,我是在master上對fix_bug進行rebase,那自然ours就是master,theirs就是fix_bug咯…然而事實告訴我們,其實並不是這樣。
仔細回憶剛才說的打patch的過程,我們其實是把master的變更作為patch打進來,所以這時候如果指定ours,那麼保留的是A的工作。而指定theirs才是保留B的(在master上)工作。
C選擇了A的工作後,git發現說,那你就是說B這個patch不要了是吧。

If you prefer to skip this patch, run “git rebase –skip” instead.

所以C這時候應該執行skip來跳過B的工作。至此,rebase完成,push吧~
ps. 在把握不好哪個是ours的時候,有個簡單的方法就是開啟那個檔案,HEAD代表ours。

相關文章