有几种方法可以在git merge时忽略特定文件的合并:
方法一:使用.gitattributes文件(推荐)
在项目根目录创建或编辑.gitattributes文件:
infostation.js merge=ours *.js merge=ours # 如果需要忽略所有js文件的合并然后设置合并策略:
# 设置合并驱动 git config merge.ours.driver true # 或者设置全局 git config --global merge.ours.driver true
这样在合并时,指定的文件会保持当前分支的版本。
方法二:手动合并并排除文件
步骤1:合并但不提交
# 执行合并但不自动提交 git merge --no-commit --no-ff 目标分支
步骤2:恢复不想合并的文件
# 恢复 infostation.js 到当前分支的版本 git checkout HEAD -- infostation.js # 或者恢复到指定分支的版本 # git checkout 源分支 -- infostation.js
步骤3:提交合并
git commit -m "合并分支,排除 infostation.js"
方法三:使用合并后重置
# 1. 正常合并 git merge 目标分支 # 2. 恢复特定文件 git checkout HEAD~1 -- infostation.js # 3. 提交恢复 git add infostation.js git commit --amend # 修改最后一次提交
方法四:使用git merge+git checkout组合
# 1. 先保存当前文件的版本 git show HEAD:infostation.js > infostation.js.tmp # 2. 执行合并 git merge 目标分支 # 3. 恢复之前的版本 cat infostation.js.tmp > infostation.js git add infostation.js git commit -m "合并分支,保留原始 infostation.js" # 4. 清理临时文件 rm infostation.js.tmp
方法五:使用 Git Hooks(自动化)
创建.git/hooks/pre-commit或.git/hooks/post-merge钩子脚本来自动恢复配置文件。
示例.git/hooks/post-merge:
#!/bin/bash # 检查是否在合并中 if [ -f ".git/MERGE_HEAD" ]; then # 恢复配置文件到当前分支的默认值 if [ "$(git rev-parse --abbrev-ref HEAD)" = "develop" ]; then echo '// window.IPConfig = "http://1.95.59.38:8083"' > infostation.js elif [ "$(git rev-parse --abbrev-ref HEAD)" = "test" ]; then echo '// window.IPConfig = "http://1.95.205.197:8083"' > infostation.js fi git add infostation.js fi设置脚本可执行:
chmod +x .git/hooks/post-merge
方法六:更好的解决方案 - 使用配置文件模板
更专业的方法是不在代码中硬编码配置,而是使用模板:
创建配置文件模板:
// infostation.js.template window.IPConfig = "{{IP_CONFIG}}"在构建或部署时生成实际配置:
# 根据环境变量生成配置文件 sed "s/{{IP_CONFIG}}/$IP_CONFIG/" infostation.js.template > infostation.js将模板加入版本控制,忽略实际配置文件:.gitignore
infostation.js # 忽略实际配置文件 !infostation.js.template # 跟踪模板
快速别名方法
创建 Git 别名简化操作:
# 创建合并并排除特定文件的别名 git config --global alias.merge-exclude '!f() { git merge --no-commit --no-ff "$1" && git checkout HEAD -- infostation.js && git commit -m "合并 $1,排除配置文件"; }; f' # 使用别名 git merge-exclude 目标分支针对你的具体情况
如果你的环境配置是:
开发分支:使用开发服务器
测试分支:使用测试服务器
建议使用.gitattributes方法(方法一),这样每个分支都能保持自己的配置,合并时不会相互覆盖。
.gitattributes文件示例:
# 合并时保留当前分支的版本 infostation.js merge=ours config/*.js merge=ours # 如果有更多配置文件注意:.gitattributes文件需要提交到仓库,这样所有开发者都会使用相同的合并策略。