可以提交包含冲突数据的文件。有没有办法将这些文件再次标记为冲突,以便运行 git mergetool 将生成必要的文件并运行合并工具?
6 回答
如果索引已经处于冲突状态,只需检查带有--conflict=merge
标志的文件:
git checkout --conflict=merge file
如果索引是干净的,因为已 [错误地] 添加了未解析的文件,只需在检查之前将其重置:
git reset file
git checkout --conflict=merge file
这将允许您正常恢复冲突解决(例如,git mergetool
)。
注意:应@fourpastmidnight 的请求,将对@jakub-narębski 的回答的评论提升为自己的回答。:)
您可以使用 获取带有冲突标记的文件内容git checkout --conflict=merge -- file
,但是如果您已经使用 (或者如果 GUI 为您这样做)清理了索引,git add file
它将无法正常工作。
有git update-index --unresolve
,但它很hacky,并且不能非常可靠地工作。我认为它恢复的状态对于 git-mergetool 来说是不够的。
您可能必须重做合并,或使用git update-index --cacheinfo
手动设置阶段版本... git-stash 可以帮助您保留正确解决的冲突。
最优雅的解决方案是从一开始就防止这个问题:
git config --global mergetool.[tool].cmd [command-line call]
git config --global mergetool.[tool].trustExitCode false
据我所知,当文件中仍然包含冲突标记时,您将无法提交。...这不完全正确:
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
不会再次调用。
@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 后没有提交。
请用git update-index --unresolve
从 git 1.7 开始,它使用索引中的 resolve-undo 信息来恢复所有 3 个阶段(1:base、2:ours、3:theirs):https ://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f