先描述下場景。
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
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不要了是吧。this
If you prefer to skip this patch, run "git rebase --skip" instead.code
因此C這時候應該執行skip來跳過B的工做。至此,rebase完成,push吧~
ps. 在把握很差哪一個是ours的時候,有個簡單的方法就是打開那個文件,HEAD表明ours。ip