Git submodules

git pull

当执行 git pull 时,如果你的项目包含有 submodule,默认情况下,git pull 不会自动更新 submodule 的内容。git pull 仅会更新主项目的内容,对于 submodule 的更新,需要你手动执行以下命令:

  1. 如果已经拉取了主项目的最新内容,可以使用以下命令更新 submodule:git submodule update --init --recursive
  2. 也可以将 git pullgit 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 操作都会更新这个文件,以反映最新拉取的状态。
  • 在你展示的日志中,你从多个不同的远程仓库(datacheryOSbuilderapps)执行了 git fetch 操作。对于每个远程仓库,Git 都会更新各自的 FETCH_HEAD 文件来指向相应的最新提交。因此,每个 fetch 操作都会导致相应的 FETCH_HEAD 被重新赋值。

FETCH_HEAD 是每个仓库唯一的:

  • FETCH_HEAD 文件位于 .git/ 目录中,属于当前本地仓库的一部分。因此,每个本地仓库都有自己的 FETCH_HEAD 文件,这个文件在你执行 git fetch 操作时被更新。
  • 在同一个仓库中,FETCH_HEAD 会存储你最近一次从远程仓库获取的分支的引用。这意味着对于特定的本地仓库来说,FETCH_HEAD 是唯一的,并且每次执行 fetch 后会被覆盖。

FETCH_HEADfetch 完成后不会自动重置:

  • 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 会执行以下操作:
    1. 初始化所有未初始化的子模块(--init)。
    2. 更新所有子模块到 .gitmodules 文件中指定的提交或分支。
    3. 递归地处理和更新所有嵌套子模块(--recursive),确保它们也被正确初始化和更新。

Git submodule status

git submodule status 命令的输出中,第一个字符表示当前子模块的状态。不同的字符代表不同的状态:

  1. 空格 ():表示子模块的状态是正常的,子模块的 HEAD 与配置的提交是匹配的。
  2. 减号 (-):表示子模块未初始化或未更新。此时子模块目录中可能没有内容,或者子模块指向的提交未被检出。
  3. 加号 (+):表示子模块的当前 HEAD 与主仓库配置的提交不一致。通常这是因为子模块在本地已经被更新,但主仓库中的引用还没有更新到新的提交。
  4. 字母 U:表示子模块有未合并的冲突。这种情况可能出现在子模块更新过程中,发生了冲突,需要手动解决。

已发布

分类

来自

标签:

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注