git pull
当执行 git pull
时,如果你的项目包含有 submodule,默认情况下,git pull
不会自动更新 submodule 的内容。git pull
仅会更新主项目的内容,对于 submodule 的更新,需要你手动执行以下命令:
- 如果已经拉取了主项目的最新内容,可以使用以下命令更新 submodule:
git submodule update --init --recursive
- 也可以将
git pull
与git submodule update
命令组合使用:git pull --recurse-submodules
这样,当执行 git pull
时,submodule 也会被自动更新。
git fetch
[new branch]
* [new branch]
表示远程仓库中有一个新的分支被检测到,并且这个分支已经被拉取到本地仓库。- 比如
* [new branch] feature/new-feature -> origin/feature/new-feature
,这意味着远程仓库中的feature/new-feature
是一个新的分支,现在它已经被同步到本地的origin/feature/new-feature
。
+ c714d9d6d...d20978934
c714d9d6d...d20978934
是一个提交历史的摘要,其中左边的c714d9d6d
是远程分支在你上次同步时的提交,右边的d20978934
是远程分支当前最新的提交。+
符号表示一个非快进式的合并(non-fast-forward),这通常意味着你本地的分支和远程分支在相同的基础上各自有新的提交,并且 Git 进行了合并或覆盖操作。如果你看到这个符号,最好仔细检查,确保不会丢失任何更改。
FETCH HEAD
FETCH_HEAD
的工作原理
FETCH_HEAD
是针对每个远程仓库的。当你从某个远程仓库执行git fetch
操作时,Git 会在本地为这个远程仓库生成一个FETCH_HEAD
文件,文件中包含了最新的提交对象指针。每次git fetch
操作都会更新这个文件,以反映最新拉取的状态。- 在你展示的日志中,你从多个不同的远程仓库(
data
、cheryOS
、builder
和apps
)执行了git fetch
操作。对于每个远程仓库,Git 都会更新各自的FETCH_HEAD
文件来指向相应的最新提交。因此,每个fetch
操作都会导致相应的FETCH_HEAD
被重新赋值。
FETCH_HEAD
是每个仓库唯一的:
FETCH_HEAD
文件位于.git/
目录中,属于当前本地仓库的一部分。因此,每个本地仓库都有自己的FETCH_HEAD
文件,这个文件在你执行git fetch
操作时被更新。- 在同一个仓库中,
FETCH_HEAD
会存储你最近一次从远程仓库获取的分支的引用。这意味着对于特定的本地仓库来说,FETCH_HEAD
是唯一的,并且每次执行fetch
后会被覆盖。
FETCH_HEAD
在 fetch
完成后不会自动重置:
FETCH_HEAD
不会自动清空或重置。它会保存最新的fetch
结果,直到下一次fetch
操作将其内容覆盖。- 当你执行
git fetch
操作时,Git 会将你获取的远程分支信息写入FETCH_HEAD
文件。这个文件会包含指向这些提交的引用,以及你从哪个远程仓库获取的这些分支。 - 如果你继续在同一个本地仓库中工作,
FETCH_HEAD
文件会一直存在并保持最新状态,直到你再次执行git fetch
操作。
Git submodule –init –recursive
--init
选项:
--init
选项用于初始化那些尚未初始化的子模块。- 当你第一次克隆一个包含子模块的仓库时,子模块的内容并不会自动被克隆下来,只有它们的路径和关联的提交信息被保留在
.gitmodules
文件中。 - 执行
git submodule update --init
会为未初始化的子模块执行初始化操作。这意味着它会克隆子模块的代码,并将其检出到指定的提交或分支。
--recursive
选项:
--recursive
选项指示 Git 递归地处理子模块中的子模块。- 如果你的子模块中还有子模块(即嵌套子模块),这个选项会确保这些嵌套的子模块也被初始化和更新。
- 这个选项特别有用,当你的项目依赖多个层级的子模块时,它可以一次性更新所有层级的子模块。
整体操作:
git submodule update --init --recursive
会执行以下操作:- 初始化所有未初始化的子模块(
--init
)。 - 更新所有子模块到
.gitmodules
文件中指定的提交或分支。 - 递归地处理和更新所有嵌套子模块(
--recursive
),确保它们也被正确初始化和更新。
- 初始化所有未初始化的子模块(
Git submodule status
git submodule status
命令的输出中,第一个字符表示当前子模块的状态。不同的字符代表不同的状态:
- 空格 ():表示子模块的状态是正常的,子模块的 HEAD 与配置的提交是匹配的。
- 减号 (
-
):表示子模块未初始化或未更新。此时子模块目录中可能没有内容,或者子模块指向的提交未被检出。 - 加号 (
+
):表示子模块的当前 HEAD 与主仓库配置的提交不一致。通常这是因为子模块在本地已经被更新,但主仓库中的引用还没有更新到新的提交。 - 字母
U
:表示子模块有未合并的冲突。这种情况可能出现在子模块更新过程中,发生了冲突,需要手动解决。
发表回复