You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS Code如何实现Git冲突的‘accept both’?自定义合并脚本思路

VS Code "Accept Both" 合并功能解析与自定义脚本实现思路

VS Code 实现"Accept Both"的底层逻辑

VS Code的"Accept Both"功能没有依赖AST解析工具,它的核心是基于纯文本层面的冲突块处理:

  • 首先通过内置的文本差异引擎识别Git标准格式的冲突块
  • 执行"Accept Both"时,直接提取冲突块中本地(HEAD侧)和远程/目标分支侧的内容,按用户设置的顺序(默认先本地后远程)拼接,然后移除Git冲突标记,完成冲突解决。
    这种实现方式足够轻量,适配所有文本类型的文件,不需要针对特定语言做结构化解析。

自定义Git合并脚本实现"Accept Both"的思路

1. 核心逻辑:处理Git冲突块格式

Git冲突块的固定格式为:

<<<<<<< HEAD
[本地修改内容]
=======
[远程/目标分支修改内容]
>>>>>>> [分支标识]

脚本的核心就是识别这种块,提取两侧内容并拼接。

2. bash脚本实现步骤

步骤1:获取所有冲突文件

用Git命令筛选出当前仓库中存在合并冲突的文件:

conflict_files=$(git diff --name-only --diff-filter=U)

步骤2:逐个处理冲突文件

对每个文件,用文本处理工具(如sed或awk)替换冲突块。以下是一个sed实现的示例,将本地内容和远程内容按顺序拼接:

for file in $conflict_files; do
  # 处理冲突块:保留本地+远程内容,移除冲突标记
  sed -i.bak '
  :loop
  /<<<<<<< HEAD/{
    # 捕获本地内容
    N
    /=======/!b loop
    # 保存本地内容到缓冲区
    h
    # 跳过到远程内容开始
    N
    :remote
    />>>>>>> /!{N;b remote}
    # 提取远程内容(去掉=======和>>>>>>>行)
    s/.*=======\n//
    s/\n>>>>>>> .*//
    # 取出本地内容,拼接远程内容
    G
    # 去掉本地内容中的<<<<<<< HEAD和=======行
    s/<<<<<<< HEAD\n//
    s/\n=======//
  }' "$file"
  # 删除备份文件
  rm "$file.bak"
  # 标记文件为已解决
  git add "$file"
done

步骤3:可选优化

  • 添加参数让用户选择拼接顺序(如--remote-first)
  • 给拼接的内容添加分隔注释,比如:
    # --- Local Changes ---
    [本地内容]
    # --- Remote Changes ---
    [远程内容]
    
  • 处理完成后输出提示:echo "已完成冲突文件的Accept Both处理:$conflict_files"

3. 注意事项

  • 脚本仅处理纯文本冲突,对于二进制文件的冲突不适用
  • 建议在测试环境先验证脚本效果,避免误改文件
  • 可以将脚本注册为Git自定义合并工具,通过git config配置调用

内容的提问来源于stack exchange,提问作者yangshi.cy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:48:19