git合并分支时禁止合并特定文件
开发过程中经常会遇到这样的场景,一个项目可能有develop(开发环境)、release(生产环境)等多个分支,经常需要对分支进行合并,但是不同分支下的一些配置文件可能会有所不同,比如数据库配置、redis配置等等。但是我们又不想每次打不同的包时都把这些文件改一遍,这时候怎么样才能偷个懒呢?Git正好提供了这样的功能。
将develop分支的代码合并到release分支,并忽略特定的文件
操作步骤如下:
1. 定义一个虚拟的合并策略,叫做 ours:
在根目录下运行命令行
git config --global merge.ours.driver true
如下图所示:
2. 在develop分支的项目根目录下新建文件.gitattributes,在文件中写入需要忽略的文件名 + merge=ours, 一个文件占一行。
例如,忽略service.properties、redis.properties、jdbc.properties 文件:
/yjxy-common-web/src/main/resources/service.properties merge=ours
/yjxy-common-web/src/main/resources/redis.properties merge=ours
/yjxy-web-admin/src/main/resources/jdbc.properties merge=ours
如下图所示:
3. 将.gitattributes文件拷贝到 release分支的项目根目录。
4. 切换回release分支
git checkout release
5. 合并分支
git merge --no-ff -m 'merge' develop
合并之后, release分支的配置文件保持了原样。
影响.gitattributes忽略规则的因素
有的文章中提到,在配置了.gitattributes文件的情况下,仍然存在一个问题:要忽略的文件在不同分支间先修改的不会合并到后修改的文件里,但是后修改的文件可以和先修改的文件进行正常合并。也就是说不同分支中,旧文件不会合并到新文件中,但新文件仍然会合并到旧文件,那么真的是这样吗?在测试过程中发现这个问题有时会出现,有时又不会出现,因此推断是有更细节的触发机制。
经过实验,得到如下结果
前置条件:假设有release、dev两个分支,两个分支的根目录下有同样的.gitattributes文件
结论1:只有在提交更改相同文件时才会触发自定义的忽略规则。
首先,这一点是确定无疑的。
结论2:如果有且仅有一个分支中的文件有修改,此时将这个分支合并到另一个分支,那么自定义忽略规则不会触发,文件仍然会成功合并。
也就是说,仅有一个分支修改过的情况下,要将这个修改过的分支合并到另一个分支的时候,是不适用忽略规则的,文件还是会被合并。
结论3:如果两个分支的文件都有变化(文件变化之后没有进行过合并),那么在进行分支合并时,自定义忽略规则会触发,设置为忽略的文件不会合并,这里不受两个分支文件修改时间先后顺序的影响。
这里是需要强调的一点,如果两个分支的文件都有变化,是会触发忽略规则的,文件不会被合并。不论两个分支中文件的修改时间先后顺序是怎样的,忽略规则都会被触发。当然,这里还有个前提,就是两个分支的文件修改之后,没有进行过合并,如果进行了合并,再次合并时,分支已经变了。