我如何处理与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 . master
在subby
分支,看起来它创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
将忽略我的子模块?
我以前没有看到过这个确切的错误。 但我猜猜你遇到的麻烦。 它看起来像是因为master
和one.one
分支包含subby
子模块的不同的参考,当你合并从master
git的变化不知道哪个ref – v1.0
或v1.1
– 应该由one.one
保存和跟踪supery
one.one
分支。
如果是这种情况,那么你需要select你想要的裁判,并提交更改来解决冲突。 这正是你正在做的重置命令。
在项目的不同分支中跟踪不同版本的子模块是一个棘手的方面。 但是子模块ref就像你项目的其他组件一样。 如果两个不同的分支在连续合并之后继续跟踪相同的子模块参考,那么git应该能够在不会引起未来合并中的合并冲突的情况下制定模式。 另一方面,如果开关子模块经常参考,则可能不得不忍受大量的冲突解决。
那么,它不是技术上与子模块冲突(即:保持这一点,但不是这样),但我find了一种方法继续工作…我所要做的就是注意我的git status
输出并重置子模块:
git reset HEAD subby git commit
这会将子模块重置为预拉提交。 在这种情况下,正是我想要的。 而在其他情况下,我需要应用到子模块的更改,我会处理那些标准的子模块工作stream程(检出主,下拉所需的标签等)。
我在这个问题上的答案挣扎了一下,也没有在类似的SOpost中find答案。 所以这对我来说是有效的 – 记住在我的情况下,子模块是由不同的团队维护的,所以冲突来自master和我正在开发的项目的本地分支中的不同子模块版本:
- 运行
git status
– logging冲突的子模块文件夹 -
将子模块重置为当前分支中上次提交的版本:
git reset HEAD path/to/submodule
-
此时,您有一个无冲突版本的子模块,您现在可以将其更新到子模块存储库中的最新版本:
CDpath/到/子模块 git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
-
现在你可以
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
为我工作:)