两个分支diff,怎样操作更便捷?

之前一直在master分支开发,后期folk了一个dev分支,然后就一直在dev分支上开发,开发了很多东西,增/删/改等等,dev和master的内容已经有了很大不同,其实已经是两套工程代码了,比如master是通用版本,dev是针对某用户专门定制的版本:master和dev都有各自独有的内容,也有公共部分,公共部分以dev为准

现在想把dev上公共部分修改的内容合并到master上,但是感觉肯定不能直接merge,冲突太复杂了。
我现在想以dev分支为基础,folk出一个dev2分支,在dev2中,首先删除掉dev独有的内容,然后把master上独有的内容以及有修改的一些内容手动拷过来。如果这样做,怎么样diff两个分支改比较方便呢?或者有其他更便利的做法吗?

PS:使用的编辑器是vscode

阅读 2.6k
1 个回答

不建议使用拷贝代码的方式,血泪的教训,会非常容易出错。

建议方法是使用 cherry-pick

如果你通用性的代码和定制的代码在提交时候就有意的分开在不同的commit里,那么使用cherry-pick的方法会非常容易。如果没有的话也没有关系,在cherry-pick过程中去将无需改动的部分拷贝回来就行。

总的过程就是在master分支上把dev分支的这些commit使用 git cherry-pick $commit_id 一个一个的放到master分支里。

有几种情况:

  1. 没冲突、也没定制代码的commit:执行完git cherry-pick就行了。
  2. 没冲突,有定制代码的commit:则cherry-pick完成后git reset HEAD~1,手动修改一下去掉那些定制的代码,然后git add; git commit正常的提交commit。
  3. 有冲突,没定制代码的commit: 处理冲突即可。
  4. 有冲突,有定制代码的commit:建议先cherry-pick处理冲突,完成并提交后。git reset HEAD~1,手动修改一下去掉那些定制的代码,然后git add; git commit正常的提交commit。

其中处理冲突的过程为:

  • 先修改冲突的文件
  • 随后git add
  • 然后git cherry-pick --continue(注意不是git commit)
  • 如果cherry-pick之后又觉得此commit完全不需要,则可以git cherry-pick --abort
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进