在干净的本地存储库上运行
git fetch upstream HEAD
后,我真的很想了解 git 的行为方式以及计划下发生的情况。
基本上步骤如下:
git clone <url>
git remote add <upstream-url>
git fetch upstream HEAD
git fetch upstream
之后我实际上看到了正在获取的数据消息,但是,在
git log --all
中我没有看到upstream/HEAD
,例如,就像什么都没发生一样。
非常欢迎任何解释:)
什么是头 - 在 Git 中,任何分支都只是指向提交的指针。
Head
只不过是指向当前签出分支的指针。因此,当您(使用 checkout 命令)从一个分支跳到另一个分支时,您的 Head
指针会发生变化并开始指向已签出分支的最新提交,就是这样。这里是关于 Git 中分支如何工作的详细解释。
获取和拉取的工作原理 - 其次,
$ git fetch fooBranch
只是将其他贡献者推送到fooBranch
的所有最新提交从远程存储库获取到本地计算机。这些获取的更改安全地存储在本地计算机上的 .git/
目录中的某个位置,并且可以通过执行 git log upstream/fooBranch
或 git log upstream/Head
进行访问。尽管此时这些更改在您的本地文件/工作区中不可见,并且您可能会看到以下命令的不同输出
$ git log upstream/fooBranch
VS
$ git log fooBranch
这向我们展示了 Git 存储了 2 个分支副本,即一个跟踪远程存储库中存在的更改,另一个用于本地存储库。当您进行提交时,它们将存储为本地分支副本的一部分,并且在推送时将被推送到远程存储库,最终将被其他贡献者获取,并将与他们自己的 fooBranch 远程副本同步。
回到我们之前的位置,现在要将获取的更改与本地存储库/工作区同步,您必须运行
$ git merge upstream/fooBranch
。现在 fooBranch
的本地和远程副本都将在本地存储库中同步,现在您将看到上述 2 个命令的相同输出。
类似地,
$ git pull upstream fooBranch
基本上是-的组合
$ git fetch upstream fooBranch + $ git merge upstream/fooBranch
这就是当您 fetch 与 pull 时发生的情况,当您执行
$ git log --all
时,您应该会看到默认分支的提交历史记录。
我希望这个解释符合您的要求。