可能会提交包含冲突数据的文件。 是否有一种方式将这些文件重新标记为有冲突,以便运行git mergetool将生成必要的文件并运行合并工具?
--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
命令获取带有冲突标记的文件内容,但是如果你已经通过 git add file
(或者GUI操作)清理了索引,它将无法工作。
git update-index --unresolve
命令可以解决这个问题,但这种方法并不可靠,并且不能很好地支持 git-mergetool。我认为它所恢复的状态不足以满足需要。git update-index --cacheinfo
手动设置版本号来解决冲突。git-stash 可以帮助你保留正确解决的冲突。git update-index --unresolve
是在“古老”的时代创建的,允许在(意外的)git add
确认冲突解决后恢复 git diff --ours
等操作。它将 HEAD 版本(未自动解决冲突的版本)放入第二阶段,将 MERGE_HEAD 版本放入第三阶段,并不会将任何内容放入第一阶段,即祖先版本。 - Jakub Narębskigit diff
。那个差异希望包含最初打算提交的变更集,因此您不需要手动重新创建所有这些工作。 - Mikko Rantalainengit reset file; git checkout --conflict=merge file
。 - Gingigit config --global mergetool.[tool].cmd [命令行调用]
git config --global mergetool.[tool].trustExitCode false
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在索引中提供了文件的公共基础、本地和远程版本。(这是它们被
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
命令(包括冲突标记)会自动移除其中两个,确保mergetool
不会再次被调用。
git mergetool
会检测到它并重新触发合并吗? - VonC@VonC:我一开始没有创建帐户(现在已经创建了),所以我无法发表评论。 调用git mergetool无法检测到它,似乎:
自动合并README 冲突(内容):README中的合并冲突 自动合并失败;解决冲突,然后提交结果。 lynx:~/test_clone$ ls README lynx:~/test_clone$ git add README lynx:~/test_clone$ git commit -a 创建提交46ee062:它有效! lynx:~/test_clone$ ls README lynx:~/test_clone$ cat README >>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README lynx:~/test_clone$ git mergetool 合并工具候选项:opendiff emerge vimdiff 没有需要合并的文件 lynx:~/test_clone$
git mergetool可以接受一个文件名,但那也不起作用:
自动合并 README 冲突 (内容): 合并冲突在 README 中 自动合并失败;修复冲突,然后提交结果。 caracal:~/test_clone2$ git mergetool 合并工具候选者 : opendiff emerge vimdiff 正在合并文件:README需要注意的是,在退出 git mergetool 后我没有进行提交。
git update-index --unresolve
自Git 1.7以来,它使用索引中的解析撤消信息来恢复所有3个阶段(1:基础,2:我们的,3:他们的):https://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f