2

我有一个主分支 A 和一个主题分支 T,它们都指向一个子模块 S。在 A 和 T 上都完成了一些工作,并且在 T 中完成的工作将子模块 S 提前了几个提交。

现在我希望将我的主题分支合并到主分支中,我发现如果我在主分支上并运行,git merge T那么子模块指针不会被分支 T 中的更改移动。

如果我在主题分支 T 上运行,git merge A那么子模块 S 现在位于主题分支 T 中向前移动的位置。

似乎您从哪个分支进行合并决定了合并所采用的子模块位置。这种行为是否符合预期?关于如何防止丢失新的子模块位置的任何想法,或者在进行合并之前您是否需要在正确的分支上?

4

1 回答 1

1

也许git submodule没有显示您的期望。演练:

# setup
git init t; cd t
git init subrepo
( cd subrepo; touch .gitignore; git add .; git commit -msubinit )
  git submodule add ./subrepo;  git add .; git commit -msubadd

# advance topic's subrepo
git checkout -b topic
( cd subrepo; touch new; git add .; git commit -mnew )
git add .; git commit -msubnew

git submodule status
(cd subrepo; git rev-parse HEAD)
git submodule status --cached
git rev-parse :subrepo
git status

git checkout master
git submodule status
(cd subrepo; git rev-parse HEAD)
git submodule status --cached
git rev-parse :subrepo
git status

git merge topic
git submodule status
(cd subrepo; git rev-parse HEAD)
git submodule status --cached
git rev-parse :subrepo
git status

git checkout -b demo master~
(cd subrepo; git rev-parse HEAD)

gimme=`git rev-parse :subrepo`
(cd subrepo; git checkout $gimme)

嵌套的 repo 是一个子模块,反之亦然。git submodule帮助完成一些管理任务。完全没有这个命令并不难。

于 2013-10-08T06:34:55.257 回答