git submodule合并冲突:如何可视化?

时间:2011-06-08 16:11:04

标签: git merge conflict git-submodules

当我最近发现

时,我感到非常高兴
git submodule summary

它很好地向我展示了提交子模块的签出提交在存储库中的引用之前或之后。

现在,当我处于与子模块冲突的合并过程中时,相同的命令不会产生有用的输出。我需要一个痛苦的gitk序列在我的主树中检查分支,以及cd进入子模块,在那里获取和gitk,比较sha1值......

什么是更方便的方式来了解冲突?

2 个答案:

答案 0 :(得分:2)

你可以制作一个剧本。以下是此类脚本的核心:

 git --git-dir=submodulepath/.git diff \
    $(git ls-tree HEAD submodulepath | cut -c 15-54) \
    $(git ls-tree MERGE_HEAD submodulepath | cut -c 15-54)

您可以使用日志或任何其他命令替换diff,以帮助您查看更改内容。一个是看它是否是一个快进合并,在这种情况下你可以快速解决冲突而不在子模块级别合并。

还有gitslave可以帮助你解决这些问题。

希望这有帮助。

答案 1 :(得分:0)

Adam's answer相同,但使用索引而不使用cut:

sub="path/to/submodule"
git --git-dir="$sub/.git" diff \
    $(git rev-parse ":2:$sub") \
    $(git rev-parse ":3:$sub")

说明:

当发生冲突时,Git会在索引中存储有关它的信息。它存储了几个不同的版本,即所谓的阶段。第一阶段是"基地"版本(共同的祖先),第2阶段是"我们的"版本和第3阶段是"他们的"版本

如果文件冲突,索引包含不同版本的blob对象ID。在子模块的情况下,它是子模块提交ID。在上面的命令中,:2:$sub指的是路径2上子模块的阶段$sub(我们的)。

请注意,您可以使用git ls-files --stage查看包含分段的索引条目列表。