Git Fetch Upstream后的git log行为
问题描述
我真的很想了解Git的行为和在我在干净的本地仓库上运行 git fetch upstream HEAD
后发生了什么。
基本的步骤如下:
- 在远程仓库(本例中是GitHub)中创建一个分支
- 在本地克隆我的分支:
git clone <URL>
- 设置上游:
git remote add <upstream-URL>
- 获取上游数据:
git fetch upstream HEAD
- 注意:我希望使用这个命令只跟踪本地仓库中的默认分支,而不是简单地用
git fetch upstream
之后,我确实看到有数据消息被获取,然而,在git log --all
中,我看不到upstream/HEAD
,好像什么都没发生一样。
解决方案
什么是Head – 在Git中,任何分支只是一个指向提交的指针。Head
只是一个指向当前已检出分支的指针。所以当你(通过checkout命令)从一个分支切换到另一个分支时,你的Head
指针会改变,并开始指向已检出分支的最新提交。这就是Git中分支工作原理的详细解释。
fetch和pull的工作原理 – 其次,$ 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
你将看到你默认分支的提交历史。