最近我发现了一件令我非常高兴的事情:
git submodule summary
这个命令可以显示当前子模块所检出的提交相对于仓库中引用的提交是超前还是落后。
但是,在处理子模块冲突合并时,同样的命令就无法提供有用的输出。此时我需要在主树中繁琐地执行一系列操作,包括使用gitk查看分支、进入子模块、获取并在其中使用gitk比较sha1值等等。
有没有更方便的方法来了解冲突的情况呢?
最近我发现了一件令我非常高兴的事情:
git submodule summary
这个命令可以显示当前子模块所检出的提交相对于仓库中引用的提交是超前还是落后。
但是,在处理子模块冲突合并时,同样的命令就无法提供有用的输出。此时我需要在主树中繁琐地执行一系列操作,包括使用gitk查看分支、进入子模块、获取并在其中使用gitk比较sha1值等等。
有没有更方便的方法来了解冲突的情况呢?
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)
与Adam的答案相同,但使用索引而不是切片:
sub="path/to/submodule"
git --git-dir="$sub/.git" diff \
$(git rev-parse ":2:$sub") \
$(git rev-parse ":3:$sub")
解释:
当存在冲突时,Git会将有关其的信息存储在索引中。它存储了几个不同的版本,称为阶段。第1阶段是“基础”版本(共同祖先),第2阶段是“我们”的版本,第3阶段是“他们”的版本。
在文件冲突的情况下,索引包含不同版本的blob对象ID。在子模块的情况下,它是子模块提交ID。在上面的命令中,:2:$sub
指的是路径为$sub
的子模块的第2
阶段(ours)。
请注意,您可以使用git ls-files --stage
查看具有阶段的索引条目列表。