先描述下場景。
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。