git attributes-合并策略

时间:2024-06-03 08:12:53

痛点:   

    最近公司在使用敏捷开发的方式,目前来说我们项目组遇到这样一个问题,在比较长的一段时间内有两个并行开发中的git分支,并且其中一个为主干分支,需要不定期地从另外一个分支merge code到主干分支上,那么这样就会带来一个问题,如果在某些相同的文件上,假如两个分支都会对其进行修改,在进行合并的时候,往往会出现很多冲突,这时候不得不花费大量时间去解决冲突,如果希望以主干分支的文件的内容为准,完全忽略另一个分支的内容,举个简单的例子说明一下,有两个branch: A和B, 一个经常在合并出现冲突的文件:pom.xml, 在从B合并到A的时候,想以A的pom.xml为准,完全忽略与B的冲突,那么如何解决这个痛点呢?GitAttributes有办法帮我们解决这样的问题,有一个.gitattributes文件可以帮助我们自定义合并策略(merge strategies),以下是官方文档:

https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes

自定义合并策略步骤:

1. 在项目根目录下的.gitattributes文件(假如没有这个文件自己想办法创建一个这样的后缀文件出来)中定义哪些文件在合并的时候要忽略冲突,并以我们当前分支的内容为准;以下列举三种方式

   A.具体到文件:pom.xml merge=ours

   B.通配符方式:*.xml merge=ours

   C.具体路径方式:WLS_DOM_Demo/war_file/src/it/resources/*.xml merge=ours,因为it目录是我们手动添加的,并不是maven标准工程的一部分,所以要想忽略it目录下的文件冲突,可以使用这种具体路径方式,上面第A,B两种方式只对标准的maven工程目录有效。

2. 大家应该有疑问,上面的ours是什么来的?个人理解这个ours就是一个git-diff的自定义driver名称,当进行code merge的时候,git会调用git-diff进行文件的比较,比较文件是否有差异,那么我们可以自定义比较的driver,让git不使用内置的比较方式,而是使用我们自定义的,所以这一步就是添加自定义的比较driver,名称为ours,在git cmd中执行如下命令:

        git config --global merge.ours.driver true

这句命令的意思是:当进行code merge,调用git-diff命令的时候,git会读取.gitattributes文件,然后发现例如pom.xml文件需要执行git-diff自定义driver:ours,而oursdriver设置为true了,于是就直接“跳过了”。

3. 执行完2的命令后,如果是window系统,那么在当前登录的user的目录下的.gitconfig文件中会多了这么几行配置,例如我的是这个目录:C:\Users\LIWA\.gitconfig

         git attributes-合并策略

4. 到处大功告成,动手进行code merge试试看。