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

时间:2012-12-30 18:48:34

标签: git git-merge

我有以下目录结构:

/.git
/.git/info/attributes
/MyProject
/MyProject/pom.xml
/MyProject/MyCode.java

我有分支大师和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

最后解决问题:

当我这样做时:

$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.

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

我不希望按照post

定义“keepMine.sh”

这个post是我需要的,但如果我有一个简单的模式,我不想逐个文件地去

谢谢!

2 个答案:

答案 0 :(得分:26)

$ git config merge.ours.driver true

甚至

$ git config --global merge.ours.driver true

'ours'不是内置的合并驱动程序之一,尽管你和我应该做的事情非常清楚,并且当自定义合并驱动程序未定义时,git似乎没有错误。

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

答案 1 :(得分:14)

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

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

git merge bugfix

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

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

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