# 背景 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,具体可以看这个 [项目](https://github.com/nruth/git-conflict-resolution-demo/tree/master),很容易就可以复现 conflict 场景  如果能启用三路合并,上面的问题能够大大缓解,VSCode 官方的 issues 也有人反馈 ([这](https://github.com/microsoft/vscode/issues/37350)),但是迟迟得不到支持... # 抢救 等不来官方,只能自己抢救一下了,这里记录下 VSCode 支持三路合并的两个方案: **方案一** - 安装 sublime merge app - 安装 VSCode 插件 Sublime Merge for VSCode - 合并遇到冲突后在文件中右键打开 Sublime Merge - 点击冲突文件的 resolve,可以进入三路合并  **方案二** - 安装 webstorm - (必须)随便打开一个项目 - (首次必选)点击顶部 菜单 > 工具 > 注册命令行命令(避免出现 webstorm not found) - (可选)配置 git config,方便下次使用 ```bash [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 进行三路合并 
Activity