解决git冲突:git mergetool无法工作

4

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

这是我的情况:

enter image description here

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

$ git pull:

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

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

如何解决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来解决冲突?我尝试过,但它也不直观。

谢谢!


你需要的 config 命令是 git config merge.tool diff3 - GoZoner
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.

这是因为您有“未提交的更改”(在SourceTree界面顶部显示)。如果您有未提交的更改,任何尝试合并都将失败。您有三个选择:
  1. 放弃所有更改(使用:git reset --hard)
  2. 隐藏所有更改(使用:git stash)
  3. 提交所有更改(使用:git add ...; git commit ...)
完成这些操作后,您将被允许进行合并。如果您选择上述第3个选项,则可能会出现冲突;选项1或2不会出现冲突。[注意:对于选项#2,稍后需要使用git stash pop,并且可能会出现冲突。]
对于问题1,请执行git config merge.tool diff3(或vimdiff等)。合并可能很困惑(通常是三方合并,因此该工具显示三个版本和一个组合版本)。
对于问题2: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

这些 SourceTree 配置选项去哪儿了?在一个 bash 脚本里吗? - bedouger
使用 git config --global difftool.sourcetree.cmd "/Applications/..." - GoZoner
git config --global difftool.sourcetree.cmd=/Applications/p4merge.app/Contents/MacOS/p4merge "$LOCAL" "$REMOTE" 错误:无效的键:difftool.sourcetree.cmd=/Applications/p4merge.app/Contents/MacOS/p4merge - Travis Bear
抱歉,你需要加上引号,如 ...cmd='/Applications/... REMOTE"' - GoZoner

1
您收到冲突消息是因为您修改了一个在远程已更改的文件,该文件将被拉入。因此,提示您要么隐藏(stash)或提交您的更改。
如果您执行其中任何一个操作,然后再进行拉取,可能会有冲突需要解决。例如,如果您拉取的更改与您的修改不在同一位置,则不会发生冲突。如果存在冲突,则合并工具可用于处理。

抱歉,我不小心编辑了你的内容,已经撤销了! - GoZoner

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