有没有办法让Git将文件标记为冲突的?

有没有办法让Git将文件标记为冲突的?,git,merge,mergetool,Git,Merge,Mergetool,可以提交包含冲突数据的文件。是否有办法再次将这些文件标记为冲突文件,以便运行git mergetool生成必要的文件并运行合并工具?据我所知,当文件中仍包含冲突标记时,您将无法提交。。。。这并不完全正确: OP提到您可以(我在这里复制),但这还不足以再次触发mergetool: Auto-merged README CONFLICT (content): Merge conflict in README Automatic merge failed; fix conflicts and then

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

据我所知,当文件中仍包含冲突标记时,您将无法提交。。。。这并不完全正确:
OP提到您可以(我在这里复制),但这还不足以再次触发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$

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

@VonC:我最初没有创建帐户(现在有),因此无法发表评论。 调用git 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 >>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README lynx:~/test_clone$ git mergetool merge tool candidates: opendiff emerge vimdiff No files need merging lynx:~/test_clone$ 自动合并自述文件 冲突(内容):在自述文件中合并冲突 自动合并失败;修复冲突,然后提交结果。 lynx:~/test\u克隆$ls 自述 lynx:~/test\u克隆$git添加自述 lynx:~/test\u克隆$git提交-a 创建提交46ee062:它工作! lynx:~/test\u克隆$ls 自述 山猫:~/test\u克隆$cat自述 >>>>>>881D60F5F738BC5716F5C9A9384E262B5357FD:自述 lynx:~/test\u clone$git mergetool 合并候选工具:opendiff emerge vimdiff 没有文件需要合并 山猫:~/test\u克隆$ git mergetool可以接受文件名,但这也不起作用:

Auto-merged README CONFLICT (content): Merge conflict in README Automatic merge failed; fix conflicts and then commit the result. caracal:~/test_clone2$ git mergetool merge tool candidates: opendiff emerge vimdiff Merging the files: README Normal merge conflict for 'README': {local}: modified {remote}: modified Hit return to start merge resolution tool (emerge): caracal:~/test_clone2$ ls #*merge*#145962bz# README README~ README.orig caracal:~/test_clone2$ git mergetool merge tool candidates: opendiff emerge vimdiff No files need merging caracal:~/test_clone2$ git mergetool README merge tool candidates: opendiff emerge vimdiff README: file does not need merging caracal:~/test_clone2$ ls #*merge*#145962bz# README README~ README.orig caracal:~/test_clone2$ 自动合并自述文件 冲突(内容):在自述文件中合并冲突 自动合并失败;修复冲突,然后提交结果。 caracal:~/test\u clone2$git mergetool 合并候选工具:opendiff emerge vimdiff 合并文件:自述文件 “自述文件”的正常合并冲突: {local}:已修改 {remote}:已修改 点击返回开始合并解析工具(浮现): 卡拉卡尔:~/test\u克隆2$ls #*合并*#145962bz#自述自述~README.orig caracal:~/test\u clone2$git mergetool 合并候选工具:opendiff emerge vimdiff 没有文件需要合并 caracal:~/test\u clone2$git mergetool自述文件 合并候选工具:opendiff emerge vimdiff 自述文件:文件不需要合并 卡拉卡尔:~/test\u克隆2$ls #*合并*#145962bz#自述自述~README.orig 卡拉卡尔:~/test\u clone2$
这里还要注意的是,我在退出git mergetool后没有提交。

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

git更新索引--unsolve
,但它很粗糙,工作不太可靠。我认为它恢复的状态对于git mergetool来说是不够的


您可能需要重新进行合并,或者使用
git update index--cacheinfo
手动设置阶段版本。。。git stash可以帮助您保留正确解决的冲突。

最优雅的解决方案是从一开始就防止此问题:
git config--global mergetool.[tool].cmd[命令行调用]

git config--global mergetool.[tool].trustExitCode false
请使用
git更新索引--unsolve


由于git 1.7使用索引中的resolve undo info来恢复所有3个阶段(1:base、2:ours、3:Theers):

如果索引已经处于冲突状态,只需使用
--conflict=merge
标志签出文件即可:

git checkout --conflict=merge file

如果索引是干净的,因为未解析的文件被[错误地]添加,只需在签出之前重置它:

git reset file
git checkout --conflict=merge file
这将允许您正常恢复冲突解决(例如,
git mergetool


注意:通过@fourpastmidnight.:)的请求,将对@jakub narębski答案的评论提升为自己的答案

你确实可以。仅仅做一个git添加就可以删除标记,然后您就可以自由提交了@克里斯蒂安:很有意思(我已经修改了答案以反映它),但是
git mergetool
会检测到它并重新触发合并吗?git确定如果一个文件在索引中有多个条目,而不仅仅是通常的条目,那么它就会发生冲突。git在工作树版本中放置冲突标记,以帮助用户解决冲突,但git不会将文件计算为未合并。调用gitadd告诉git将文件的工作树版本添加到索引中,删除所有其他条目。git添加后,由于现在只有一个索引项,所以文件不再是“未解析”的,因此您可以提交它。@Christian:在Charles的评论后完成了我的回答。@CharlesBailey是否可以在索引中为文件添加额外的项,以故意使git将文件解释为冲突的?我认为在某些情况下,在运行自定义合并驱动程序后,在索引中制造冲突版本会很好…嘿,我刚刚写了这个响应。;-)什么是黑客和不可靠的?
git更新索引--unsolve
是在“古代”时代创建的,允许在(意外)
git add
确认冲突解决后恢复
git diff--ours
等。它在第2阶段填充头版本(不是解决了自动可解决冲突的版本),在第3阶段填充合并头版本,而在第1阶段(祖先版本)中没有添加任何内容。如果有人提交了冲突合并和实际工作的混合体,我看不出“Git很容易损坏存储库”的情况。Git保存了提交人所问状态的逐字副本,不管该状态有多疯狂。最后,我可能会重做合并,然后使用重做合并进行
git diff
,这会导致合并提交混乱。希望该差异大致包含最初打算提交的变更集,这样您就不需要手动重新创建所有这些工作。如果索引是干净的,因为未解析的文件被错误地添加,您可以将其重置:
git reset file;git checkout--conflict=merge file
。刚刚完成我的a
git reset file
git checkout --conflict=merge file