Open
Description
背景
git merge 的过程中,代码冲突往往是不可避免的,项目越大,人越多,冲突越多
这里先说下两种 git 的代码合并模式,一种是快速合并 fast-forward,一种是三方合并,提示冲突的是后面这种
自己在使用 VSCode 的时候就遇到过以下问题:
- 这段代码,是合并 current 的代码还是 incoming 的(包括这两个概念也很难理解)
- 为什么代码合并提交后,其他同学的部分代码神奇消失了,从导致了线上问题
- ...
最近就发现了一个真实的线上 Bug:代码拆分解耦后上线,部分代码神秘丢失了,导致线上功能展示异常,还好问题不是很大...
原因
原因就在于 VSCode 并不支持 git merge 的三路合并,合并代码的时候,只能看到自己的代码和此分支原有的最新代码,我的拆分 commit,和第二个 commit 在原分支上的功能新增 commit 冲突了,由于代码量较大,并没有发现新增代码的痕迹,漏掉了相关功能的迁移,从而导致了此问题...
从图一来看,就是三方合并中,C4 和 C2 都改了同一个文件,但是提示 conflict 的时候只能看到 C4 和 C2 的 diff,看不到原始文件 C6,导致 C2 的新增功能被忽略了
复现
下面是一个代码 merge 冲突的 demo,具体可以看这个 项目,很容易就可以复现 conflict 场景
如果能启用三路合并,上面的问题能够大大缓解,VSCode 官方的 issues 也有人反馈 (这),但是迟迟得不到支持...
抢救
等不来官方,只能自己抢救一下了,这里记录下 VSCode 支持三路合并的两个方案:
方案一
- 安装 sublime merge app
- 安装 VSCode 插件 Sublime Merge for VSCode
- 合并遇到冲突后在文件中右键打开 Sublime Merge
- 点击冲突文件的 resolve,可以进入三路合并
方案二
- 安装 webstorm
- (必须)随便打开一个项目
- (首次必选)点击顶部 菜单 > 工具 > 注册命令行命令(避免出现 webstorm not found)
- (可选)配置 git config,方便下次使用
[mergetool "webstorm"]
cmd = webstorm merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
trustExitCode = true
[merge]
tool = webstorm
- 遇到项目冲突后,项目根目录运行 git mergetool,进入 webstorm 进行三路合并