4

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

这是我的情况:

在此处输入图像描述

我参与master其中,需要提交并推动我的所有更改。

$ git拉:

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

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

如何解决 Git 中的合并冲突?

不幸的是,这两种解决方案都不能很好地工作。我可能会使用 stash(获取差异并使其干净)并进行手动解析,但想使用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 来解决冲突?我试过了,但它也不直观。

谢谢!

4

2 回答 2

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. 取消所有更改(使用git reset --hard:)
  2. 存储所有更改(使用git stash:)
  3. 提交所有更改(使用git add ...; git commit ...:)

完成后,您将被允许合并。如果您选择上面的选项#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
于 2013-04-04T02:33:58.390 回答
1

您收到冲突消息是因为您已对远程更改的文件进行了修改,该文件将被拉入。因此,该消息将存储或提交您的更改。

如果你做这些事情中的任何一个然后拉,可能有也可能没有任何冲突需要解决。例如,如果您引入的更改与您的修改不在同一位置,则不会发生冲突。如果有合并工具应该可以处理它。

于 2013-04-03T21:09:23.707 回答