Git:如何接受子模块冲突中的“theirs”版本?

7

当子模块冲突时(即合并的两个提交包含对引用提交的不同更改),我如何轻松地将子模块设置为“theirs”提交?对于文件,我会执行以下操作:

git checkout --theirs <file>

然而,这对于子模块是不起作用的。从技术层面上讲,我所拥有的是包含阶段 123submodule 的索引:

$ git ls-files -s module
160000 89b085c4269259fa22632353071e6875f158afde 1       submodule
160000 b9ad3bc8aafdf52a2adf74620afae8934474b82d 2       submodule
160000 1afd42893d18ef5edeeadd67e7c65262505e6004 3       submodule

我希望在阶段 0 中使用 "theirs" 版本。
$ git ls-files -s module
160000 1afd42893d18ef5edeeadd67e7c65262505e6004 0       submodule

更新: 删除了关于参考http://fiji.sc/wiki/index.php/Git_submodule_tutorial的错误断言。

更新2: 添加了与索引相关的示例。


你尝试在子模块文件夹内执行 git checkout --theirs 了吗? - penartur
不,在父代码库文件夹中。 - mstrap
子模块是独立的存储库。有特定的命令来处理它们。 - YuriAlbuquerque
1
我不想触碰子模块仓库,我只想让父仓库的“子模块指针”指向“他们”的提交,而不是“我们”的提交。 - mstrap
1个回答

2
您的父级存储库只是指向子模块存储库的当前工作版本。 "子模块指针"始终指向子模块的工作副本。
因此,您必须使子模块存储库处于所需状态(在这种情况下,通过将其更新为“theirs”版本)。之后,“子模块指针”将自动更新自己(当然,您需要提交更改)。

1
那么,在不涉及子模块的情况下,没有(简单的)方法将我的父存储库中的阶段3转换为阶段0? - mstrap
@mstrap 您希望您的父存储库工作副本引用“stage 0”,而子模块工作副本位于“stage 3”?为什么要这样做?您如何考虑父存储库的工作副本应该工作 - 应该使用“stage 0”(由git引用)还是“stage 3”(工作副本中的实际文件)? - penartur
2
我不同意:父存储库将引用的子模块提交作为单独的信息存储。该引用可能与实际的子模块HEAD不同。尽管如此,您可能是正确的,即在不触及子模块本身的情况下无法更改父存储库中的引用(以便能够执行简单的“git add module”操作)。 - mstrap
“这个引用可能与实际子模块 HEAD 不同。” - 我说的不是 HEAD,而是你的 工作副本(它可能与实际子模块 HEAD 不同)。你必须触及子模块本身的工作副本;但是,当然,你不必触及子模块存储库。 - penartur
1
在你的回答中,你建议“将子模块存储库置于所需状态”。这正是我想要避免的。我认为可能有一些低级别的Git命令可以操作我的父存储库.git/index文件以产生所需的结果。但很可能并没有这样的命令。 - mstrap
显示剩余3条评论

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