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

时间:2009-05-05 20:11:34

标签: git branch git-submodules conflict

我有一个引用多个子模块的git超级项目,我正在尝试锁定其他项目成员的工作流程。

对于这个问题,假设我的超级项目被称为supery,子模块被称为subby。 (然后是我正在尝试做的简化......我实际上并没有使用分支版本,但我认为最简单的问题就是布局。)

我的supery主分支将git项目v1.0的标记subby作为子模块引用。 supery的分支名为one.one,并将子模块的引用更改为指向v1.1的代码subby

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

基本上在git pull . master分支中运行subby后,看起来它会创建其他子模块。

在拉/合并之前,我从git submodule分支机构的one.one获得了所需的响应:

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

但是在拉动之后,当我运行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可以忽略我的子模块的参数吗?

8 个答案:

答案 0 :(得分:71)

好吧,它在技术上没有管理与子模块的冲突(即:保留这个而不是那个),但我找到了继续工作的方法......我所要做的就是关注我的git status输出并重置子模块:

git reset HEAD subby
git commit

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

答案 1 :(得分:35)

我对这个问题的答案有点挣扎,并且a similar SO post中的答案也没有太多运气。所以这对我有用 - 请记住,在我的情况下,子模块由不同的团队维护,因此冲突来自master和我正在研究的项目的本地分支中的不同子模块版本:

  1. 运行git status - 记下带有冲突的子模块文件夹
  2. 将子模块重置为当前分支中最后提交的版本:

    git reset HEAD path/to/submodule

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

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

答案 2 :(得分:17)

之前我没有看到过那个确切的错误。但我猜你遇到的麻烦。这看起来是因为master的{​​{1}}和one.one分支包含supery子模块的不同引用,当您从subby合并更改时,git不知道哪个引用masterv1.0 - 应由v1.1的{​​{1}}分支保留和跟踪。

如果是这种情况,那么您需要选择所需的ref并提交该更改以解决冲突。这正是您使用 reset 命令所做的。

在项目的不同分支中跟踪子模块的不同版本是一个棘手的方面。但子模块ref与项目的任何其他组件一样。如果两个不同的分支在连续合并之后继续跟踪相同的相应子模块refs,那么git应该能够计算出模式而不会在将来的合并中引发合并冲突。另一方面,如果经常切换子模块,你可能不得不忍受大量的冲突解决。

答案 3 :(得分:13)

首先,找到要引用子模块的哈希值。然后运行

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

这对我来说是有用的,可以让我的子模块得到正确的哈希引用,并继续我的工作,而不会产生任何进一步的冲突。

答案 4 :(得分:9)

我的git rebase -i origin/master问题出现了问题。我想采用主模块的子模块参考,所以我只是做了:

git reset master path/to/submodule

然后

git rebase --continue

这解决了我的问题。

答案 5 :(得分:2)

从这次讨论中获得帮助。

git reset HEAD subby
git commit

为我工作:)

答案 6 :(得分:1)

在我的父目录中,我看到:

PYTHONPACKAGES

所以我就这样做了

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)

答案 7 :(得分:1)

如果要使用上游版本:

rm -rf <submodule dir>
git submodule init
git submodule update