如何通过.gitattributes在Git分支合并时让指定文件保持不变?
解决Git合并时保留特定分支文件的问题
问题根源
你当前的方案存在两个核心问题:
merge=ours驱动仅在两个分支都修改了目标文件导致冲突时才会触发,如果只有单分支修改文件,Git会直接采用修改后的版本,不会执行驱动逻辑。git merge -s ours是全局合并策略,会让所有文件都保留当前分支版本,完全覆盖了其他文件的合并需求。
可行解决方案
方案一:合并后手动恢复目标文件(简单直接)
适合偶尔合并的场景,操作步骤清晰可控:
# 合并dev分支,不自动提交合并结果 git merge dev --no-commit # 用当前分支(main)的版本覆盖指定文件 git checkout HEAD -- Project/appsettings.json Project/Program.cs # 完成合并提交 git commit -m "Merge dev into main, retain appsettings.json and Program.cs from main"
如果是从dev分支合并main分支,想保留dev的特定文件,操作逻辑一致:
git merge main --no-commit git checkout HEAD -- Project/appsettings.json Project/Program.cs git commit -m "Merge main into dev, retain appsettings.json and Program.cs from dev"
方案二:配置自定义合并驱动(自动处理)
适合频繁合并的场景,配置一次后自动生效:
- 配置自定义合并驱动,让指定文件始终采用当前分支版本:
git config merge.keepours.driver "git checkout HEAD -- %f"
- 更新
.gitattributes文件,绑定目标文件到该驱动:
echo 'Project/appsettings.json merge=keepours' >> .gitattributes echo 'Project/Program.cs merge=keepours' >> .gitattributes
- 提交配置并同步到所有分支:
git add .gitattributes git commit -m "Set keepours merge driver for branch-specific files" git push origin main git checkout dev git merge main git push origin dev
后续合并分支时,这两个文件会自动保留当前分支的版本,其他文件正常执行合并逻辑。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

