浅谈git rebase和git checkout --ours(theirs)

3638 查看

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