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)。
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/服务名
- 标出最近发布、配置、证书、镜像或依赖变更
git status
git diff --name-only --diff-filter=U2. 在故障发生的同一位置复现
很多误判来自测试位置不同:本机通不代表服务器通,容器内通不代表宿主机通,集群外通也不代表 Pod 内通。复现命令要尽量贴近真实流量路径。
- 从报错服务所在机器执行测试
- 必要时加 Host、SNI、namespace 或代理参数
- 把成功路径和失败路径的输出并排比较
git diff --name-only --diff-filter=U
git checkout --theirs <file>
git checkout --ours <file>3. 读取服务端证据,而不是只看客户端提示
客户端报错通常是结果摘要。真正能区分根因的是服务端日志、内核日志、事件、进程状态或数据库状态。
- 用 git status 确认冲突文件列表。
- 逐个文件手动编辑解决 <<<<<<< ======= >>>>>>> 冲突标记。
- 解决后用 git add 标记冲突已解决。
git checkout --theirs <file>
git checkout --ours <file>
git mergetool4. 做最小修复并立即回归验证
每次只改一个变量,修复后用同一条复现命令回测,并观察日志是否停止增长。这样可以避免多个临时改动互相掩盖。
- merge 场景用 git commit 完成合并,rebase 场景用 git rebase --continue 继续。
- 冲突复杂时使用 git mergetool 辅助解决。
- 需要重来时用 git merge --abort 或 git rebase --abort 放弃操作。
git rebase --continue
git merge --abortCommands
排查命令与使用意图
命令 1
用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。
git status命令 2
用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。
git diff --name-only --diff-filter=U命令 3
用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。
git checkout --theirs <file>命令 4
用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。
git checkout --ours <file>命令 5
用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。
git mergetool命令 6
用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。
git rebase --continue命令 7
用于确认 Git/SSH 的最终配置和认证链路。注意输出中可能包含仓库地址、用户名或代理信息,分享前应脱敏。
git merge --abortRisk 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 合并冲突太多
Need More Help
这个问题还没完全解决?
把你的报错、环境和已经尝试过的步骤发给我,后续会优先补充到排障手册。