解决git冲突:git mergetool不起作用

时间:2013-04-03 21:02:18

标签: git conflict git-merge atlassian-sourcetree

我需要解决git中的冲突,但作为一个新手,不确定什么是最有效的方法。

这是我的情况:

enter image description here

我在master,需要提交并推送所有更改。

  

$ git pull:

     

错误:您对“foo.cpp”的本地更改将被合并覆盖。   中止。请在合并之前提交更改或存储更改。

有几个冲突的文件。当然,我在网上搜索过:

How to resolve merge conflicts in Git?

不幸的是,这两种解决方案都运作良好我可以使用stash(使用diff并使其干净)并进行手动解析,但是想使用git mergetool或SourceTree。

这是我尝试过的:

$ git config merge.conflictstyle diff3
$ git mergetool
merge tool candidates: tortoisemerge emerge vimdiff
No files need merging
$ git mergetool -t vimdiff
No files need merging
$ git mergetool -t vimdiff foo
foo.cpp: file does not need merging
$ git diff foo.cpp
diff --git a/foo.cpp b/foo.cpp
index xxxxxx yyyyy
--- a/foo.cpp
+++ b/foo.cpp
@@ .....
..... <omitted>
$

我不确定是什么问题。 git mergetool无法正常运行。它说不需要合并。但是,它显示了差异和git pull报告冲突。

Q1)如何使用mergetool进行交互式冲突解决或合并?

Q2)是否可以使用SourceTree解决冲突?我尝试过,但也不直观。

谢谢!

2 个答案:

答案 0 :(得分:4)

您看到的错误:

error: Your local changes to 'foo.cpp' would be overwritten by merge. Aborting. Please, commit your changes or stash them before you can merge.

是因为你有uncommitted changes(它在SourceTree显示的最顶部说明了这一点)。如果您有未经修改的更改,任何合并的尝试都将失败。你有三个选择:

  1. Ax所有更改(使用:git reset --hard
  2. 存储所有更改(使用:git stash
  3. 提交所有更改(使用:git add ...; git commit ...
  4. 完成后,您将被允许合并。如果您选择上面的选项#3,则可能会出现冲突;选项#1或#2不会发生冲突。 [注意:对于选项#2,您稍后会git stash pop,之后可能会发生冲突。]

    对于你的Q1:做git config merge.tool diff3(或vimdiff,或其他)。合并可能令人困惑(通常是3向合并,因此该工具显示三个版本和组合版本)。

    对于你的Q2:SourceTree不包含它自己的合并工具;你需要依赖另一个(我使用p4merge和SourceTree)。使用这些配置选项:

    difftool.sourcetree.cmd=/Applications/p4merge.app/Contents/MacOS/p4merge "$LOCAL" "$REMOTE"
    difftool.sourcetree.path=
    mergetool.sourcetree.cmd=/Applications/p4merge.app/Contents/MacOS/p4merge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
    mergetool.sourcetree.trustexitcode=true
    

答案 1 :(得分:1)

您收到冲突消息是因为您已对远程更改的文件进行了修改,这些文件将被拉入。因此,要么隐藏或提交更改的消息。

如果您执行其中任何一项操作,那么可能会或可能不会有任何冲突需要解决。例如,如果您提取的更改与修改不在同一位置,则不会发生冲突。如果有合并工具应该起作用来处理它。