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

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

相關文章
相關標籤/搜索