在浅克隆存储库中工作时,如何可靠地执行变基?假设我有一个分支feature
,我想将其立足于master
。我通常如何做的是git fetch
更新master
分支,然后是git rebase master
以重新建立基础(从feature
分支)。但是,如果我理解正确,那么必须正确地执行两个分支的最新共同祖先,才能正确执行变基。
例如,假设整个历史记录如下:
D-E (master)
/
A-B-C
\
F-G (feature)
我希望它最终像这样:
A-B-C-D-E (master)-F-G (feature)
如果我克隆存储库的深度为2,那么在本地历史记录将如下所示:
D-E (master)
F-G (feature)
所以我的计划是将历史扩展到有一个共同的祖先,如下所示:
while [ -z $( git merge-base master feature ) ]; do
git fetch --deepen=100;
done
这一切都很好。但是,有时我会遇到这样的问题,即我的本地历史记录最终看起来像以下内容(其中*
表示嫁接):
D*-E (master)
/
B*
\
F*-G (feature)
我不明白我的本地存储库如何最终处于这种状态,如果处于这种状态,如何获取历史记录中的C
。我发现的唯一解决方案是暂时使克隆不浅,但这非常耗时和空间,因此我想找到一个更好的解决方案。
注意:这是问题的简化版本。我正在运行的精确克隆命令是git clone https://... --depth=8 --single-branch
,根据git log
,我在历史记录中最终得到28个提交(其中7个已被移植,第一个出现在17个提交之前)。这对我来说毫无意义,因为我对--depth=
选项的理解是,我应该以8次提交结束,最后一次提交是嫁接的。另外,我的遥控器在提取时不支持--deepen=
选项,因此我将git fetch depth=$x
和x
一起使用。