如何理解git子模块功能的工作流程

时间:2019-01-31 07:54:27

标签: git github git-submodules

我正在使用git子模块:

1)创建MASTER项目git repo,进行一些提交

2)创建SUB项目git repo,进行一些提交

3)使用git子模块功能,将SUB添加到MASTER / somefolder /

4)然后Alice在SUB(分支Alice)上进行2次提交。

5)然后Bob执行2次提交,分支Bob。

6)然后,我通过子模块功能将Alice和Bob的提交添加到SUB和MASTER中。


在此过程中,我有些困惑:

1)在将SUB添加到MASTER中的初始化过程中,MASTER将如何记住在SUB中添加提交?

例如,如果SUB有2个分支,那么在MASTER中会记住哪个分支的提交?

是否使用SUB的master分支?还是使用SUB的HEAD?

如果使用HEAD,那么如果我将HEAD指向SUB的另一个分支(不是master),会发生什么?

2)当我将Alice的2次提交添加到MASTER中时,MASTER将如何知道我要添加Alice的2次提交,而不是Bob的?

据说MASTER不关心SUB的分支,只关心SUB的提交。


这是我对git子模块功能实现的理解:

MASTER只记住一个提交ID,例如abcdefg123456。

然后,如果您执行git submodule update --init --recursive,MASTER将在abcdefg123456的分支中下载所有提交,直到abcdefg123456提交为止。

对吗?


如果上面的方法正确,那么我很困惑,分支Alice和Bob都添加提交,如果我在Alice中使用abcdefg123456,那么如何添加Bob的提交?

1 个答案:

答案 0 :(得分:0)

主git存储库(MASTER)及其子模块(SUB)被视为独立存储库

您可能已经知道,一旦在任何SUB目录(或子目录)中 cd ,所有git命令都将应用于SUB(并且仅适用于SUB)。然后,如果您 cd 回到任何MASTER目录(不是任何其他子模块目录),则所有git命令都引用MASTER。

所以您是对的,MASTER唯一要记住的关于SUB的信息是远程地址单个sha1参考(并且没有分支名称或标记名称)。