我们的团队正在使用 git 子模块,但是我们在 pull 时遇到了一些错误,这告诉我们即使我们最近更新了(并且从那以后没有远程提交/推送),我们还是落后了。这发生在两种情况下:
- 在我们的子模块中分离
HEAD
,或 - 使用时
git commit --amend
。
我将尝试展示这些事情发生的场景。我的问题是,有谁知道具体错误在哪里,以及修复它们的简单方法(比我们的肮脏黑客更好)?
场景 1 - 分离式HEAD
- 我们发行:
git clone --recursive $REPO $DIR
git sfe 'git pull origin master'
git submodule update --recursive
- 我们实际上并没有使用这么多,因为它往往使我们处于分离HEAD
状态
- 我们检查所有分支是否都打开
master
(或至少不处于分离HEAD
状态)git sfe 'git branch'
。如果没有,我们发出一个git sfe 'git checkout master'
. (我们目前都(约 4 人)在 master 上开发,只是为了尽量减少合并和启动和运行) - 如果我们处于 detached
HEAD
,进行更改,然后切换到master
(因此我们的未暂存文件保留在工作目录中),暂存并提交这些更改,然后尝试推送,Git 说我们必须拉动,因为我们落后了。我们可以通过以下方式解决这个问题:- 说“拧它”,检查一个完全干净的超级模块,确保我们没有处于分离状态
HEAD
,然后从那里开始工作 - 获取修订号,
git checkout master
然后发出 agit merge $REV
并经历重新合并当前更改与似乎存在的过去更改冲突的痛苦。
- 说“拧它”,检查一个完全干净的超级模块,确保我们没有处于分离状态
场景 2 - 修改提交
- 这个不多。我将自己开发,发布 a
git commit --amend
,然后尝试推动这些更改。但是,当我这样做时,它告诉我我落后了,必须合并。当我这样做时,将所有当前更改与过去的修订重新合并,这又是一个痛苦的过程。- 这是因为我试图推送基于不再是的提交的东西
HEAD
吗?
- 这是因为我试图推送基于不再是的提交的东西
注意:git sfe
是我们的别名git submodule foreach --recursive
(我们有一些嵌套的子模块,只是为了自虐[或者更确切地说,我们需要能够将代码分离出来并且子子模块的放置是有意义的事实])