为什么 git fetch 不创建本地分支?

Why git fetch does not create local branches?

据我了解,每当您 运行 git fetch 远程对象在本地下载并且名为 FETCH_HEAD 的轻量级指针指向远程分支的 HEAD 提交时创建。

由于分支只是一个指针,这与创建本地分支有何不同?什么设计考虑支持在使用 git fetch 时不创建本地分支的情况?

查看此条目 What does FETCH_HEAD in Git mean? .

Since a branch is simply a pointer, how is this different from creating a local branch? What design considerations support the case for not creating a local branch whenever using git fetch?

因为 git fetch 是为了遣返 已知 远程分支和相关丢失对象的状态。这不同于具有同系物本地分支,在这种情况下,后者可能被配置为跟踪其远程同系物。

分支机构经常被配置为自动创建本地分支机构,确实如此,但只有在您首先使用 git checkout 查看它们时才会发生。

git fetch 实际上可以 在本地创建一些 新分支,但不是你的[=44] =].对于每个新分支,它都会创建一个 远程跟踪分支 ,一个远程状态的图像,您不能像与 您的 本地一样与之交互分支机构,git branch.

中列出的分支机构

如果自从您上次获取后在您的遥控器上创建了一些新分支,git 将获得它们的新引用,以及所有需要的祖先。

示例:

在您的本地存储库中

A---B---C---D <<< master, origin/master

在远程"origin"上,工作已经完成(一个新的分支,并且master已经前进)

A---B---C---D---G <<< master
             \
              \
               E---F <<< new-feature

如果此时获取,您将获得一个新的引用 new-feature(您可以使用 git branch -r 验证),并且 origin/master 将更新为指向 G , 但 不是 master, 仍将保持不变。

               G <<< origin/master
              /
             /
A---B---C---D <<< master
             \
              \
               E---F <<< origin/new-feature

然后它还允许您在检查这些新更改之前决定是否以及如何将它们集成到您的本地工作中。

我现在正在使用一个存储库,每次我获取一个新的远程分支时,该命令都没有创建本地分支。检查 .git/config 文件并将其与其他存储库进行比较,我可以看到获取信息不同:

[remote "origin"]
    url = ssh://git@MYREPOURL.git
    fetch = +refs/heads/master:refs/remotes/origin/master

将其更改为以下值后,它开始工作:

fetch = +refs/heads/*:refs/remotes/origin/*