SourceTree合并异常:提示冲突却无冲突文件且未同步feature分支变更
隐性空白/元数据冲突
Git会将文件空白符、换行格式或权限变更标记为冲突,但SourceTree默认可能不展示这类无实际代码变更的冲突。合并时系统检测到冲突却无文件显示,大概率是这类隐性冲突导致。
排查:终端执行git diff --check可直接列出所有空白类冲突;也可在SourceTree设置中开启「显示空白字符差异」选项,重新查看冲突。合并提交被覆盖或未真正执行
若main分支存在未拉取的远程提交,合并dev时可能触发快进合并,导致dev分支的变更被远程main的新提交覆盖;或是合并操作因缓存异常未真正生成合并提交。
排查:执行git reflog查看main分支的操作历史,确认合并提交是否存在,是否有重置、强制推送等操作覆盖了之前的合并。feature分支变更未实际合并到development
看似feature合并到dev成功,实则可能是空合并(比如feature分支已被之前的合并包含),或是合并时误选了「保留当前分支版本」(--ours参数)导致变更被丢弃。
排查:用git log --oneline feature..development检查dev是否包含feature的所有提交;或git diff feature development对比两个分支的实际差异。SourceTree本地缓存异常
SourceTree的UI状态缓存可能与Git仓库实际状态不同步,导致冲突显示错误、合并结果误判。
排查:点击SourceTree工具栏的「刷新」按钮重置状态;或终端执行git reset --hard HEAD重置本地分支后,重新拉取远程分支再尝试合并。数据库变更文件未被Git追踪
如果表结构变更对应的迁移脚本、ORM配置文件被.gitignore忽略,或是未添加到Git仓库,即使代码合并成功,这些变更也不会同步到main分支,导致生产数据库与本地不一致。
排查:检查.gitignore文件是否包含数据库相关文件;执行git status查看是否有未追踪的变更文件。
内容的提问来源于stack exchange,提问作者Seto

