有没有一种方法可以关闭Git的冲突解决?

8

有没有办法在将文件输入三路合并工具之前完全关闭git尝试解决冲突的方式?

我的意思是这些行:

<<<<<<< Temporary merge branch 1
...
=======
...
>>>>>>> Temporary merge branch 2

它将它们与分支更改添加到基本文件中,然后将其馈送到kdiff3中,后者变得完全疯狂,显示奇怪的冲突。

我希望只保留基本版本不变。

到目前为止,我仅找到了这个选项

merge.conflictstyle

但似乎没有关闭这些行的选项。

除了编写预处理程序以剥离这些行之外,还有其他方法吗?

更新

我将解释我不喜欢的内容。

问题在于,当git启动kdiff3时,基本版本包含像下面这样的行:

X1
<<<<<<< Temporary merge branch 1
A
=======
B
>>>>>>> Temporary merge branch 2
X2

本地修订包含以下内容:
X1
A
X2

远程版本包含以下内容:

X1
B
X2

这里的X1X2是3个文件中的一些常见代码行。

现在,kdiff3在这里发出了冲突信号。

如果我将这些文件复制到一个单独的文件夹中,并删除<>之间的所有内容,那么kdiff3就能更好地合并文件,有时甚至自动完成。

http://www.gitguys.com/topics/merging-with-a-gui/上看,实际上它不应该显示基础版本中的行。但它确实这样做了。我该怎么办呢?

Git配置

git config -l返回如下:

core.symlinks=false
core.autocrlf=false
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
pack.packsizelimit=2g
help.format=html
http.sslcainfo=/bin/curl-ca-bundle.crt
sendemail.smtpserver=/bin/msmtp.exe
diff.astextplain.textconv=astextplain
rebase.autosquash=true
user.name=Pavel Gatilov
user.email=********
merge.tool=kdiff3
mergetool.kdiff3.path=C:/Program Files (x86)/KDiff3/kdiff3.exe
diff.guitool=kdiff3
difftool.kdiff3.path=C:/Program Files (x86)/KDiff3/kdiff3.exe
difftool.kdiff3.cmd="C:/Program Files (x86)/KDiff3/kdiff3.exe" "$LOCAL" "$REMOTE"
core.editor="C:/Program Files (x86)/GitExtensions/GitExtensions.exe" fileeditor
core.autocrlf=false
credential.helper=!"C:/Program Files (x86)/GitExtensions/GitCredentialWinStore/git-credential-winstore.exe"
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
core.safecrlf=true
remote.origin.url=********
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.develop.remote=origin
branch.develop.merge=refs/heads/develop
gui.wmstate=normal
gui.geometry=887x427+175+175 171 192
branch.8480-il.remote=origin
branch.8480-il.merge=refs/heads/8480-il
branch.branch-9354.remote=origin
branch.branch-9354.merge=refs/heads/branch-9354

版本

我使用的工具及版本如下:

工具             版本号
------------------------
msysgit          1.8.1.msysgit.1
Git Extensions   2.44
kdiff3           0.9.97

无论是通过 Git Extensions 还是通过 git mergetool 运行合并时,都存在问题。

更新2

我已尝试配置 kdiff3 预处理程序命令以删除文件中不需要的部分,但它似乎是基于每行的基础工作的,因此无法解决这个问题。

我可以编写一个预处理包装器,但我现在不想这样做。


1
我在使用 git 和 kdiff3 进行合作时从未遇到过问题,也没有更改任何与此相关的设置。所以我想知道当你说 kdiff “完全疯了,显示奇怪的冲突” 时你到底是什么意思。 - Daniel Hilgarth
不应该。你的合并工具配置是什么样子的? - Edward Thomson
2
我觉得你的BASE版本可能实际上包含了这些行,如果文件之前有合并冲突并且有人在没有解决任何问题的情况下进行了“git add”操作,那么它就会得到这些行。 - jthill
@jthill:我之前遇到过你描述的问题,但今天却与PavelGatilov所描述的完全相同——“真正”的基本修订版本没有任何垃圾,但是git提供给合并工具的文件确实有...有趣的是,这只发生在特定的提交上——同一存储库中以前的合并冲突解决都很好,但在这个提交中,当提供给合并工具时,所有冲突的文件都会以这种方式被破坏。有趣的是看看它是否会再次发生,或者问题是否与某种特定的合并有关... - Tao
1
@Tao 根据我的经验,如果涉及到3个或更多分支的交叉合并,并且来自一个分支的2个修订版本沿不同路径合并到另一个分支中,则通常会出现此问题。例如,对于3个分支A、B、C,您将修订版本A1合并到B中,然后稍后将A2合并到C中,最后将C合并到B中。在某些情况下,git和hg都会认为A2的更改与A1的更改发生冲突。并且两者都会尝试解决这个问题。不幸的是,我无法进行简单的重现... - Pavel Gatilov
显示剩余5条评论
2个回答

7
你可以在.gitattributes中设置标志来配置Git的行为,要关闭Git冲突解决,我们可以使用merge=union标志来实现。
示例 .gitattributes
* merge=union

我们不必指定所有文件都没有合并选项,也可以选择性地对一些文件进行操作,例如:

*.java merge=union
src/generated/* merge=union

这些代码行调整了Java文件的合并选项,以及src/generated文件夹中所有文件的合并选项。

在此再次发生之前,我无法进行验证,但我会假设它是正确的并授予悬赏。 - user247702
是的,这个问题的难点在于它很罕见且很难在人工环境中重现。解决方案看起来很有前途,如果有机会我会进行检查。 - Pavel Gatilov
我又遇到了这个问题,你的解决方案似乎有效。合并标记仍然出现在$BASE中,但它们不再在$MERGED中引起问题。 - user247702

1

你可以设置配置变量mergetool.<tool>.cmd,这样你就不需要初始/默认合并了。

git merge-tool在合并之后使用(如手册所述)。


我已经添加了配置。似乎没有指定 mergetool.kdiff3.cmd - Pavel Gatilov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接