##痛点: 最近公司在使用敏捷开发的方式,目前来说我们项目组遇到这样一个问题,在比较长的一段时间内有两个并行开发中的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
自定义合并策略步骤:
在项目根目录下的.gitattributes文件(假如没有这个文件自己想办法创建一个这样的后缀文件出来)中定义哪些文件在合并的时候要忽略冲突,并以我们当前分支的内容为准;以下列举几种方式
A. 具体到文件:pom.xml merge=ours
B. 通配符方式:.xml merge=ours
C. 具体路径方式:.env merge=ours
D. src/**/* merge=ours
大家应该有疑问,上面的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了,于是就直接“跳过了”。
需求 dev 分支合并到 master 分支,两个分支都有相同文件名的配置,但配置内容不一样
合并时以 master 分支的配置文件为准,忽略 dev 分支的配置文件
dev 分支
.env
master 分支
.env
merge=ours 满足的条件 文件必须有差异和冲突
1. # git config --global merge.ours.driver true
2. 在 master 分支下创建 .gitattributes 文件
内容为:
.env merge=ours
.env.dev.test merge=ours
src/**/* merge=ours
3. 在合并之前,在 master 分支先创建 .env 文件 或者 修改 .env 的内容(如果有 .env 文件)
(为什么要这么做:应该是在文件发生冲突时才会执行ours的合并策略,以我们的文件为主)
(修改 .env 的内容,不用在每次合并都去修改,只需要在第一次这么做。不管后期合并多少次,都会有差异 git 都会以 master 的 .env 为准)
4. 在 master 分支执行合并
# git merge dev
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。