Skip to content

[工具推荐+Bug Note] 关于 git merge 代码冲突不得不说的问题 #24

Open
@PeterChen1997

Description

@PeterChen1997

背景

git merge 的过程中,代码冲突往往是不可避免的,项目越大,人越多,冲突越多

这里先说下两种 git 的代码合并模式,一种是快速合并 fast-forward,一种是三方合并,提示冲突的是后面这种

image

自己在使用 VSCode 的时候就遇到过以下问题:

  • 这段代码,是合并 current 的代码还是 incoming 的(包括这两个概念也很难理解)
  • 为什么代码合并提交后,其他同学的部分代码神奇消失了,从导致了线上问题
  • ...

最近就发现了一个真实的线上 Bug:代码拆分解耦后上线,部分代码神秘丢失了,导致线上功能展示异常,还好问题不是很大...

原因

原因就在于 VSCode 并不支持 git merge 的三路合并,合并代码的时候,只能看到自己的代码和此分支原有的最新代码,我的拆分 commit,和第二个 commit 在原分支上的功能新增 commit 冲突了,由于代码量较大,并没有发现新增代码的痕迹,漏掉了相关功能的迁移,从而导致了此问题...

从图一来看,就是三方合并中,C4 和 C2 都改了同一个文件,但是提示 conflict 的时候只能看到 C4 和 C2 的 diff,看不到原始文件 C6,导致 C2 的新增功能被忽略了

复现

下面是一个代码 merge 冲突的 demo,具体可以看这个 项目,很容易就可以复现 conflict 场景

image

如果能启用三路合并,上面的问题能够大大缓解,VSCode 官方的 issues 也有人反馈 (),但是迟迟得不到支持...

抢救

等不来官方,只能自己抢救一下了,这里记录下 VSCode 支持三路合并的两个方案:

方案一

  • 安装 sublime merge app
  • 安装 VSCode 插件 Sublime Merge for VSCode
  • 合并遇到冲突后在文件中右键打开 Sublime Merge
  • 点击冲突文件的 resolve,可以进入三路合并

image

方案二

  • 安装 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 进行三路合并

image

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions