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