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

我有一个git超级项目,引用几个子模块,我想locking一个工作stream程,其余的我的项目成员工作。

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

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

我可以在这些分支的每一个工作顺利,但如果我尝试更新one.one分支与master分支的变化,我收到一些冲突,我不知道如何解决它们。

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

在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分支包含subby子模块的不同的参考,当你合并从master git的变化不知道哪个ref – v1.0v1.1 – 应该由one.one保存和跟踪supery one.one分支。

如果是这种情况,那么你需要select你想要的裁判,并提交更改来解决冲突。 这正是你正在做的重置命令。

在项目的不同分支中跟踪不同版本的子模块是一个棘手的方面。 但是子模块ref就像你项目的其他组件一样。 如果两个不同的分支在连续合并之后继续跟踪相同的子模块参考,那么git应该能够在不会引起未来合并中的合并冲突的情况下制定模式。 另一方面,如果开关子模块经常参考,则可能不得不忍受大量的冲突解决。

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

 git reset HEAD subby git commit 

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

我在这个问题上的答案挣扎了一下,也没有在类似的SOpost中find答案。 所以这对我来说是有效的 – 记住在我的情况下,子模块是由不同的团队维护的,所以冲突来自master和我正在开发的项目的本地分支中的不同子模块版本:

  1. 运行git status – logging冲突的子模块文件夹
  2. 将子模块重置为当前分支中上次提交的版本:

    git reset HEAD path/to/submodule

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

      CDpath/到/子模块
     git submodule foreach git pull origin SUBMODULE-BRANCH-NAME 
  4. 现在你可以commit并重新开始工作。

首先,find您想要的子模块的引用。 然后运行

 ~/supery/subby $ git co hashpointerhere ~/supery/subby $ cd ../ ~/supery $ git add subby ~/supery $ git commit -m 'updated subby reference' 

这已经为我工作,让我的子模块正确的哈希引用,并继续我的工作,没有得到任何进一步的冲突。

我有这个问题与git rebase -i origin/master到分支。 我想采取submodule ref的主版本,所以我只是做了:

git reset master path/to/submodule

接着

git rebase --continue

这解决了我的问题。

得到这个讨论的帮助。 在我的情况下

 git reset HEAD subby git commit 

为我工作:)