为什么基于git checkout remotes / origin / remote_branch可以在git checkout -b $ local_branch后看到正确的文件

问题描述

我所做的是

  1. git fetch获取所有远程分支元数据,

  2. git checkout remotes/origin/$remote_branch

  3. git checkout -b $local_branch

当我在Intellij中浏览文件时,远程分支上的所有文件都能正确显示
拉远程文件的魔力是什么?

解决方法

拉远程文件的魔力是什么?

您的第二次签出确实根据您当前的HEAD(即origin / $ remote_branch)创建了一个本地分支。

但是正确的命令是使用新命令git switchpresented here

git switch -c $local_branch origin/$remote_branch
,

您从一个错误的假设开始:git fetch不仅获得元数据,还获得 commits 。提交包含数据(文件的快照)和元数据:有关谁进行提交,何时执行等等的信息。获得所需的任何新提交后,您的git fetch然后继续更新您的远程跟踪名称,即origin/*名称。它们的全名是refs/remotes/origin/name,其中每个 name 对应一个分支名称,就像在另一个Git中一样,位于origin

当您运行git checkout remotes/origin/branch时,您的Git会将您置于分离的HEAD 模式,并且已签出一个特定的提交。因此,此步骤更新了您可以在工作树中看到的文件。 git checkout -b name步骤创建了一个新的 name ,用于标识同一提交(即refs/remotes/origin/branch标识的同一提交),并且不需要更新文件。

重要的是 commits 。这些名称,无论是origin/somebranch之类的远程跟踪名称,还是somebranch之类的(本地)分支名称,都只能帮助您(和Git)查找。提交包含文件,并且是 历史记录。 git fetch步骤从其他一些Git存储库中获取它们拥有的,不需要的,不需要的任何新提交;从那时起,您在这里所做的一切都是本地的。