git Troubleshooting

Git 合并冲突解决流程

git merge 或 git rebase 出现冲突时,用 git status 列出冲突文件,逐个手动解决 <<<<<<< ======= >>>>>>> 标记,再 git add 标记为已解决,merge 场景 git commit、rebase 场景 git rebase --continue,需要撤销用 --abort。

冲突时先 git status 看冲突文件,手动编辑解决 <<<<<<< ======= >>>>>>> 标记,再 git add 和 git commit(rebase 用 git rebase --continue)。

适用环境Git / HTTPS / 代理网络
风险等级
最后验证2026-07-03
建议权限普通用户

Scenario

这篇文章解决什么问题

适用于“Git 合并冲突解决流程”对应的线上或本地排障场景。不要只根据最终报错下结论,应先把问题拆成入口、链路、目标服务和资源限制几层,再用命令逐层证实。冲突时先 git status 看冲突文件,手动编辑解决 <<<<<<< ======= >>>>>>> 标记,再 git add 和 git commit(rebase 用 git rebase --continue)。

Symptoms

典型现象

  • git merge 或 git rebase 出现冲突时,用 git status 列出冲突文件,逐个手动解决 <<<<<<< ======= >>>>>>> 标记,再 git add 标记为已解决,merge 场景 git commit、rebase 场景 git rebase --continue,需要撤销用 --abort。
  • 相关日志、命令或页面中反复出现 git、merge、conflict 等关键词。
  • 同一服务在不同机器、不同入口或不同时间段表现不一致,需要通过证据链缩小范围。

Before Debugging

排查前先确认

  • 先区分 HTTPS、SSH、代理、证书和账号权限问题。
  • 查看配置来源,确认 system/global/local 哪一级覆盖了当前仓库。
  • 保留 verbose 输出,但不要泄露 token、私钥和 Cookie。

Root Causes

常见根因分层

协议和认证链路选错

HTTPS 走 CA/代理/token,SSH 走密钥/ssh config/agent。两套链路的排查命令和配置项不同。

  • git remote -v 看协议
  • HTTPS 用 GIT_CURL_VERBOSE
  • SSH 用 ssh -vvv

代理或证书配置污染

全局代理、公司 CA、本地抓包代理、过期证书都会让 Git 报 SSL 或连接失败。

  • git config --show-origin 查来源
  • 确认系统时间
  • 配置企业 CA 而非关闭校验

密钥没有被真正使用

密钥文件存在不代表 SSH 提交了它。Host 匹配、IdentitiesOnly、ssh-agent 都可能改变最终行为。

  • ssh -G 查看最终配置
  • ssh -T 验证平台账号
  • 确认 authorized_keys 权限

Diagnosis Path

分步诊断流程

1. 固定现场,避免追着变化状态跑

先记录故障时间、影响入口、完整错误和最近一次变更。Git 合并冲突解决流程 这类问题经常在重启、重试或缓存刷新后短暂消失,没有现场信息会很难复盘。

  • 截图或保存完整错误文本
  • 记录请求域名/IP/端口/namespace/服务名
  • 标出最近发布、配置、证书、镜像或依赖变更
1. 固定现场,避免追着变化状态跑
git status
git diff --name-only --diff-filter=U

2. 在故障发生的同一位置复现

很多误判来自测试位置不同:本机通不代表服务器通,容器内通不代表宿主机通,集群外通也不代表 Pod 内通。复现命令要尽量贴近真实流量路径。

  • 从报错服务所在机器执行测试
  • 必要时加 Host、SNI、namespace 或代理参数
  • 把成功路径和失败路径的输出并排比较
2. 在故障发生的同一位置复现
git diff --name-only --diff-filter=U
git checkout --theirs <file>
git checkout --ours <file>

3. 读取服务端证据,而不是只看客户端提示

客户端报错通常是结果摘要。真正能区分根因的是服务端日志、内核日志、事件、进程状态或数据库状态。

  • 用 git status 确认冲突文件列表。
  • 逐个文件手动编辑解决 <<<<<<< ======= >>>>>>> 冲突标记。
  • 解决后用 git add 标记冲突已解决。
3. 读取服务端证据,而不是只看客户端提示
git checkout --theirs <file>
git checkout --ours <file>
git mergetool

4. 做最小修复并立即回归验证

每次只改一个变量,修复后用同一条复现命令回测,并观察日志是否停止增长。这样可以避免多个临时改动互相掩盖。

  • merge 场景用 git commit 完成合并,rebase 场景用 git rebase --continue 继续。
  • 冲突复杂时使用 git mergetool 辅助解决。
  • 需要重来时用 git merge --abort 或 git rebase --abort 放弃操作。
4. 做最小修复并立即回归验证
git rebase --continue
git merge --abort

Commands

排查命令与使用意图

命令 1

用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。

命令 1
git status

命令 2

用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。

命令 2
git diff --name-only --diff-filter=U

命令 3

用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。

命令 3
git checkout --theirs <file>

命令 4

用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。

命令 4
git checkout --ours <file>

命令 5

用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。

命令 5
git mergetool

命令 6

用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。

命令 6
git rebase --continue

命令 7

用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。

命令 7
git merge --abort

Risk Notes

容易踩坑的地方

  • 不要把私钥上传到服务器或仓库,密钥泄露会导致整个账号被攻破。
  • 不要在报错截图里暴露 token、仓库私有地址和代理凭证,这些信息会被搜索引擎索引。
  • 不要使用全局用户名和邮箱配置,避免在个人项目仓库中留下公司身份信息。

Verification

修复后怎么确认

  • 原始故障现象已经消失,且使用同一入口重新测试 Git 合并冲突解决流程 能稳定成功。
  • 服务端日志不再出现同类错误,监控中的错误率、重启次数、连接数或延迟回到正常区间。
  • 如果做过临时绕过,已经记录恢复计划,例如还原宽松策略、补监控、补限制或提交正式配置。

Prevention

后续预防

  • 为公司代理和个人代理分别维护 profile 或脚本,不混在全局配置,避免配置冲突。
  • 每个 Git 平台使用独立 SSH key 并写清 Host 别名,避免提交了错误的密钥。
  • 不要把 sslVerify=false 作为永久配置,应使用正确的 CA 证书路径解决证书问题。
  • 定期检查和轮换 Git 访问令牌,避免过期 token 导致 CI/CD 流水线中断。

常见问题

ours 和 theirs 在 merge 和 rebase 中含义相反吗?

是的。rebase 会翻转 ours 和 theirs 的指向,使用前要先用 git status 确认当前所在分支。

冲突太多怎么办?

可能需要拆分提交、缩小合并范围,或重新评估合并策略和分支管理流程。

Long-tail SEO

你可能正在搜索这些报错

下面这些错误原文、场景词和中英文搜索词,都是排查同类问题时常见的入口。

  • git merge conflict 解决
  • git rebase 冲突处理
  • git checkout ours theirs
  • git mergetool 使用
  • git merge --abort
  • git rebase --continue
  • git 冲突标记 解决
  • git 合并冲突太多