56

可以提交包含冲突数据的文件。有没有办法将这些文件再次标记为冲突,以便运行 git mergetool 将生成必要的文件并运行合并工具?

4

6 回答 6

41

如果索引已经处于冲突状态,只需检查带有--conflict=merge标志的文件:

git checkout --conflict=merge file

如果索引是干净的,因为已 [错误地] 添加了未解析的文件,只需在检查之前将其重置:

git reset file
git checkout --conflict=merge file

这将允许您正常恢复冲突解决(例如,git mergetool)。

注意:应@fourpastmidnight 的请求,将对@jakub-narębski 的回答的评论提升为自己的回答。:)

于 2016-05-18T16:37:15.910 回答
29

您可以使用 获取带有冲突标记的文件内容git checkout --conflict=merge -- file,但是如果您已经使用 (或者如果 GUI 为您这样做)清理了索引,git add file它将无法正常工作。

git update-index --unresolve,但它很hacky,并且不能非常可靠地工作。我认为它恢复的状态对于 git-mergetool 来说是不够的。

您可能必须重做合并,或使用git update-index --cacheinfo手动设置阶段版本... git-stash 可以帮助您保留正确解决的冲突。

于 2010-05-07T01:17:57.300 回答
7

最优雅的解决方案是从一开始就防止这个问题:
git config --global mergetool.[tool].cmd [command-line call]
git config --global mergetool.[tool].trustExitCode false

于 2010-05-18T15:08:17.697 回答
2

据我所知,当文件中仍然包含冲突标记时,您将无法提交。...这不完全正确:
OP提到你可以(我在这里复制他的 pastbin),但这还不足以让 mergetool 再次触发:

Auto-merged README
CONFLICT (content): Merge conflict in README
Automatic merge failed; fix conflicts and then commit the result.
lynx:~/test_clone$ ls
README
lynx:~/test_clone$ git add README
lynx:~/test_clone$ git commit -a
Created commit 46ee062: It works!
lynx:~/test_clone$ ls
README
lynx:~/test_clone$ cat README
<<<<<<< HEAD:README
testingtesting
=======
hmm
>>>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README
lynx:~/test_clone$

正如Charles Bailey评论并在此SO 答案中说明的那样,查询合并工具是因为索引中有 3 个相同文件的实例

对于冲突中未合并的文件,git 会在索引中提供文件的通用基础、本地和远程版本。(这是读取它们以用于 3-way diff 工具的位置git mergetool。)您可以使用 git show 来查看它们:

# common base:
git show :1:afile.txt

# 'ours'
git show :2:afile.txt

# 'theirs'
git show :3:afile.txt

git add(任何内容,包括冲突标记)将自动删除其中 2 个,确保mergetool 不会再次调用。

于 2010-05-06T11:50:27.183 回答
0

@VonC:我一开始没有创建帐户(我现在有),所以我无法发表评论。调用 git mergetool 并没有检测到它,似乎:

自动合并自述文件
CONFLICT(内容):在 README 中合并冲突
自动合并失败;修复冲突,然后提交结果。
lynx:~/test_clone$ ls
自述文件
lynx:~/test_clone$ git add README
lynx:~/test_clone$ git commit -a
创建提交 46ee062:它有效!
lynx:~/test_clone$ ls
自述文件
lynx:~/test_clone$ cat 自述文件
>>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README
lynx:~/test_clone$ git mergetool
合并工具候选:opendiff 出现 vimdiff
没有文件需要合并
猞猁:~/test_clone$

git mergetool 可以接受文件名,但这也不起作用:

自动合并自述文件
CONFLICT(内容):在 README 中合并冲突
自动合并失败;修复冲突,然后提交结果。
caracal:~/test_clone2$ git mergetool
合并工具候选:opendiff 出现 vimdiff
合并文件:自述文件

'README' 的正常合并冲突:
  {本地}:修改
  {远程}:修改
点击返回开始合并解析工具(emerge):
狞猫:~/test_clone2$ ls
#*merge*#145962bz# README README~ README.orig
caracal:~/test_clone2$ git mergetool
合并工具候选:opendiff 出现 vimdiff
没有文件需要合并
caracal:~/test_clone2$ git mergetool 自述文件
合并工具候选:opendiff 出现 vimdiff

自述文件:文件不需要合并
狞猫:~/test_clone2$ ls
#*merge*#145962bz# README README~ README.orig
狞猫:~/test_clone2$

这里还要注意,我在退出 git mergetool 后没有提交。

于 2010-05-06T21:30:24.237 回答
0

请用git update-index --unresolve

从 git 1.7 开始,它使用索引中的 resolve-undo 信息来恢复所有 3 个阶段(1:base、2:ours、3:theirs):https ://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f

于 2015-01-18T17:28:08.910 回答