子模块中类似于git checkout ours/theirs的等效操作是什么?

10

当我解决文件中的冲突时,我可以:

git checkout --ours filename

然后提交该文件。这将解决冲突。但是,

git checkout --ours submodule

似乎不起作用。子模块的参考提交没有更改。

在解决子模块引用冲突时,git checkout --ours 文件名的等效操作是什么?


这可能是git 1.7.1的问题。在三个备选项(-2--oursHEAD)中,只有git checkout HEAD submodule执行了它应该执行的操作。也许在更新版本的git上,这三个选项都可以工作。 - Greg
1个回答

5

考虑到您的下一个问题, 您可以尝试对子模块的三个阶段进行检查:

git checkout -1 -- submodule # common ancestor
git checkout -2 -- submodule # source
git checkout -3 -- submodule # destination or MERGE_HEAD

一旦子模块的gitlink被更改,请不要忘记使用git submodule update来刷新其内容。

OP Amiramix 提到了这个quora答案, 其中Facebook的生产工程师Berk D. Demir补充道:

git checkout -1 file

将文件从两个分支的祖先检出。这既不是“ours”也不是“theirs”。它是这两个分支分叉之前的文件版本。非常方便。 正如您所猜测的,参数-2是从HEAD获取的版本,参数-3是从MERGE_HEAD获取的版本。 通过提交的符号引用可以使用所有其他Git命令来访问这些文件。 git checkout MERGE_HEAD -- file会产生与--theirs或-3相同的效果。 在处理合并冲突时,另一种方便的语法是路径的冒号级别的前缀。git show :3:file将显示来自MERGE_HEAD的文件(而不是差异)。一个小技巧表:
-1 == $(git merge-base HEAD MERGE_HEAD)
-2 == --ours == HEAD
-3 == --theirs == MERGE_HEAD

那么,git checkout -2 -- submodule 是否相当于正常文件合并中的“ours”,而 git checkout -3 -- submodule 是否相当于“theirs”?此外,我只是在合并,不需要将子模块检出或更新到特定提交。我可以忽略 git submodule update 并仅提交合并后的更改吗? - Greg
@Amiramix 是的,两个问题都是肯定的。 - VonC
好的,谢谢,稍后会测试一下,如果有效就接受。 - Greg
我正在测试,但似乎不起作用。git checkout -1 -- submodule 返回 unknown switch \1'git checkout -2git checkout -3没有返回任何错误,但是git diff` 仍然显示未合并路径中的三个提交(theirs、ours 和本地检出)。我正在使用 git 1.7.1(被 Centos6 卡住了),这可能是原因吗? - Greg
@Amiramix 可能可以。我已经好几年没用过1.7了。我建议在Centos6上编译2.11(https://git-scm.com/book/en/v2/Getting-Started-Installing-Git#Installing-from-Source,依赖项列在http://www.linuxfromscratch.org/blfs/view/svn/general/git.html中)。 - VonC
我刚刚发现并正在测试这个答案 https://www.quora.com/In-a-git-merge-conflict-how-do-I-tell-git-that-for-files-X-Y-and-Z-I-want-it-to-screw-the-local-changes-and-simply-overwrite-with-the-version-being-pulled-in,看起来等价的 git checkout HEAD submodulegit checkout MERGE_HEAD submodule 在1.7.1中有效。你能否将其添加到答案中,我会接受它。 - Greg

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