git合并分支时忽略合并部分文件

作者 拓荒 日期 2019-06-03
Git

最近在开发公司的H5和小程序以及微信公众号,H5和微信公众号代码基本上时一样的,但是公众号使用了一些微信的接口,例如:定位、上传图片、支付等等,总会和H5的代码有些不一样的地方,如果在代码里面做判断会把代码弄得比较乱,就在想可不可以用git将代码建成两个分支,当以后需要修改BUG或升级功能的时候只修改一份代码,然后和另一个分支合并,但是合并的时候需要忽略各自私有的代码文件,上网查了下资料还真的可以这样做,便尝试测试一下,如下操作

  1. 在代码根目录创建.gitattributes文件,里面配置合并代码时需要忽略的文件:

    文件1 merge=ours
    文件2 merge=ours
  2. git配置文件添加merge.ours.driver true,执行以下命令

git config --global merge.ours.driver true
  1. 切换到需要修改的分支修改代码、提交代码,然后切换到需要和其他分支合并的分支,执行合并操作
    git merge <分支名>

结果却没有达到自己的预期,不需要合并的文件还是合并了,看了几篇网上的资料基本都是一样的教程,很是令人失望,最后看到一篇文章说,只有当前分支里面需要或略合并的文件提交记录需要比被合并的分支的那个文件要新才能不被合并。这真是个大坑,好多文章都没有说明…

所以合并之前要在当前分支修改下然后提交再合并才行,那我不需要修改这个文件怎么办?只有修改下注释内容喽,加个空格什么的,没办法呀。这样操作后确实达到了自己的预期。

后来我有发现一种可行的方案,感觉这种方案比较好,就是先合并分支git merge <分支名>,此时当前分支会有一个或多个文件时提交状态,这个时候将已经是提交状态的文件移到缓存区git reset --soft或用vscode进行’撤销上次提交’,这样我们就可以清除掉不需要修改的文件了git reset <文件名>或用vscode还原修改,然后再进行提交

有时候我我们需要合并部分代码,而不是忽略部分代码,虽然意思差不多,但是我们的目的是合并部分代码,说明修改的文件多,需要合并的文件少,也可以使用以下方式:
切换到需要合并的分支,例如master分支:git checkout master,执行git checkout <被合并的分支名> file1 file2 ...,如果要合并某个分支上的一个commit,执行git cherry-pick <被合并分支上的某个commit>