场景需求
主分支(master)合并特性分支(dev)的更改到主分支,同时忽略其中某些文件。比如说忽略配置文件,这个比较常见。
为了解决这个问题,我们可以利用 git 提供的合并策略来实现。
创建并开启自定义驱动
master# git config --global merge.ours.driver true
配置驱动策略
master# echo 'index.php merge=ours' >> .gitattributes
master# git add .gitattributes
master# git commit -m 'chore: Preserve index.php during merges'
查看策略配置
master# ls -al
master# cat .gitattributes
index.php merge=ours
测试合并策略
master# git checkout dev
dev# git rebase master
这里有冲突解决冲突,然后合并index.php,
再修改index.php中的内容和master中的index.php内容不同,待会儿查看结果。
dev# git checkout master
master# git merge -s ours dev
查看结果
master主分支和dev分支的index.php内容不同,
dev分支index.php并没有合并到master分支中,说明我们的合并策略生效。
注意问题
-
如果是要忽略目录,比如是src/,需要写成src/**,这点和.gitignore中的写法略有区别
-
如果采用rebase方式合并,一定要注意启用 git config --global pull.rebase true
-
目的分支(master)内容可以合并到参考分支,参考分支(dev)中被加入到合并策略的文件不会合并到目的分支,
- 也就是说 master 中的可以合并到dev,dev中的不能合并到master,这也是我们的初衷。
参考文档
https://www.jianshu.com/p/cec1539c0a33
https://segmentfault.com/a/1190000004965378
https://git-scm.com/docs/git-merge#_description
https://git-scm.com/docs/gitattributes
https://blog.yowko.com/2017/05/git-attributes-merge-strategy.html?m=1