浅谈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

相关文章
相关标签/搜索