告诉git在特定文件上使用我们的合并策略

Bar*_*475 21 git git-merge

我有以下目录结构:

/.git
/.git/info/attributes
/MyProject
/MyProject/pom.xml
/MyProject/MyCode.java
Run Code Online (Sandbox Code Playgroud)

我有分支主和bugfix.在两个分支上都修改了pom.xml和MyCode.java.我想将仅来自bugfix的更改合并到MyCode.java的master,并保留pom.xml文件的主版本.

所以我添加了"/.git/info/attributes"因为我不想在项目中提交.gitattributes

$cat .git/info/attributes
pom.xml merge=ours
$git status
# On branch master
nothing to commit (working directory clean)
$git check-attr -a pom.xml
pom.xml: merge: ours
Run Code Online (Sandbox Code Playgroud)

最后到了问题:

当我做:

$git merge bugfix
Auto-merging MyProject/pom.xml
CONFLICT (content): Merge conflict in MyProject/pom.xml
Automatic merge failed; fix conflicts and then commit the result.
Run Code Online (Sandbox Code Playgroud)

Git忽略了属性设置.我在这里失踪了什么?

我不想在这篇文章中定义"keepMine.sh"

这篇文章是我需要的,但是如果我有一个简单的模式,我宁愿不逐个文件

谢谢!

jth*_*ill 28

$ git config merge.ours.driver true
Run Code Online (Sandbox Code Playgroud)

甚至

$ git config --global merge.ours.driver true
Run Code Online (Sandbox Code Playgroud)

'ours'不是内置的合并驱动程序之一,即使你和我完全清楚它应该做什么,并且当自定义合并驱动程序未定义时,git似乎没有错误.

(true上面只是unix true命令,它的成功说它使本地版本看起来正确,在这种情况下通过什么都不做.)

  • 所以基本上,合并策略的git book属性示例[http://git-scm.com/book/ch7-2.html]只是**属性示例,如果没有明确打开甚至预先打包,它将无法工作,但不是默认的合并驱动程序..得到它,谢谢! (2认同)

小智 15

从我使用git版本1.7.1进行的测试中,我发现除非有合并要求,否则不会执行任何合并驱动程序(无论你在配置中放置什么,也不管任何git属性).

如果你从"master"扩展到你自己的本地分支"bugfix",然后在你自己的分支中编辑一堆东西,那就提交它.然后再次检查"主"分支,然后执行以下操作:

git merge bugfix
Run Code Online (Sandbox Code Playgroud)

您可能希望"merge = ours"属性在这种情况下保护您.它不会!如果从主分支中没有对该特定文件进行编辑,那么分支"bugfix"将踩到分支"master",因为时间"bugfix"从master分支出来.没有编辑意味着不需要合并,这意味着不运行合并驱动程序.这似乎是一个常见的问题,git应该具有预先定义的特定属性,以便在所有情况下为外部合并提供文件绝对本地保护.

FWIW,我已经读过其他人的意见,配置文件应该是本地的和私有的,而不是检查到git.我认为那是一种bollox:当然我想跟踪配置文件中的更改.当然,协作工具的想法是我希望能够将我的配置与我团队中其他人正在运行的配置进行比较,或者将开发配置与生产配置进行比较.一个工具的整个想法是它可以帮助您完成工作.

作为一个kludgy解决方案,我提出的最好的是一个配置目录,每个配置文件都有不同的名称(即config/production config/test config/devel_joe config/devel_bill等等),所有这些都进入git .然后在部署时,实际工作配置文件将从该config目录中复制出来.我认为这是一种丑陋的方法,因为它远离命名分支的想法,但至少它是安全的.