23

我有以下目录结构:

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

我有分支大师和错误修复。在两个分支上 pom.xml 和 MyCode.java 都被修改了。我想只为 MyCode.java 合并从 bugfix 到 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 忽略了属性设置。我在这里想念什么?

我不想根据这篇文章定义“keepMine.sh”

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

谢谢!

4

2 回答 2

29
$ git config merge.ours.driver true

甚至

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

'ours' 不是内置的合并驱动程序之一,即使你和我都非常清楚它应该做什么,而且当自定义合并驱动程序未定义时,git 似乎不会出错。

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

于 2012-12-31T08:40:49.137 回答
17

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

如果您从“master”分支到您自己的本地分支“bugfix”,然后在您自己的分支中编辑一堆东西,请提交。然后你再次签出“master”分支,然后执行以下操作:

git merge bugfix

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

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

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

于 2014-02-28T03:56:46.067 回答