我如何管理与git子模块的冲突?

我有一个git超级项目引用了几个子模块,我试图锁定一个工作流程,以供我的其他项目成员工作。

对于这个问题,可以说我的超级项目叫做supery ,子模块叫做subby 。 (然后简化我正在做的事情......我实际上并没有使用分支的版本,但我认为这是最简单的一个问题。)

我的supery主分支拥有git project subby的标签v1.0作为子模块引用。 supery的分支称为one.one ,并将子模块的引用更改为指向subby的标签v1.1

我可以在每个分支中顺利工作,但如果我尝试使用master分支的更改更新one.one分支,我会收到一些冲突,而我不知道如何解决它们。

基本上在运行git pull . master git pull . mastersubby分支,它看起来像它创建额外的子模块。

在pull / merge之前,我从one.one分支得到来自git submodule的所需响应:

$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)

但是在拉动之后,当我运行git submodule模块时,它会添加更多的子git submodule

$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.

$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)

如何删除/忽略不需要的子模块引用并提交我的冲突和更改? 还是有一个参数,我可以用我的原始git pull ,将忽略我的子模块?


我以前没有看到过这个确切的错误。 但我猜猜你遇到的麻烦。 它看起来像,因为masterone.one的分支机构supery包含不同裁判subby子模块,当你从合并改变master混帐不知道哪个裁判- v1.0v1.1 -应由保存和跟踪one.one supery one.one分支。

如果是这种情况,那么你需要选择你想要的ref并提交这个改变来解决冲突。 这正是你使用reset命令所做的。

这是在项目的不同分支中跟踪不同版本的子模块的棘手方面。 但子模块ref就像您的项目的其他任何组件。 如果两个不同分支在连续合并后继续跟踪相同的子模块参考,那么git应该能够计算出模式,而不会在将来的合并中引发合并冲突。 另一方面,如果开关子模块经常参考,则可能需要忍受大量冲突解决。


那么,它不是技术上与子模块冲突(即:保留但不是这样),但我找到了一种继续工作的方式......我所要做的就是注意我的git status输出并重置子模块:

git reset HEAD subby
git commit

这会将子模块重置为预拉提交。 在这种情况下,正是我想要的。 而在其他情况下,我需要应用于子模块的更改,我将使用标准子模块工作流程(checkout master,下拉所需标签等)处理这些更改。


我在这个问题上的答案挣扎了一下,并没有在类似的SO帖子中找到答案。 所以这对我很有用 - 记住在我的情况下,子模块是由不同的团队维护的,所以冲突来自master和我正在处理的项目的本地分支中的不同子模块版本:

  • 运行git status - 记录冲突的子模块文件夹
  • 将子模块重置为当前分支中上次提交的版本:

    git reset HEAD path/to/submodule

  • 此时,您有一个无冲突版本的子模块,您现在可以将其更新到子模块存储库中的最新版本:

    cd path/to/submodule
    git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
  • 现在你可以commit并重新开始工作。

  • 链接地址: http://www.djcxy.com/p/16423.html

    上一篇: How do I manage conflicts with git submodules?

    下一篇: git submodule update