【问题标题】:Why git fetch does not create local branches?为什么 git fetch 不创建本地分支?
【发布时间】:2019-09-18 11:12:38
【问题描述】:

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

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

【问题讨论】:

标签: git git-branch git-fetch


【解决方案1】:

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

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

因为git fetch 旨在遣返已知 远程分支的状态和相关的丢失对象。这与拥有同源本地分支不同,在这种情况下,本地分支可能会被配置为跟踪其远程同源。

实际上,分支经常被配置为自动创建本地分支,但只有在您首先使用git checkout 签出它们时。

【讨论】:

    【解决方案2】:

    git fetch 实际上可以在本地创建一些个新分支,但不是你的。对于每个新分支,它都会创建一个 remote-tracking 分支,这是一个远程状态的图像,您无法与 您的 本地分支进行交互,这些分支在git branch.

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

    例子:

    在您的本地仓库中

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

    在远程“原点”上,工作已经完成(一个新分支,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 branch -a 检查“您的”分支和 remote-tracking 分支。但是,当您从 Internet 中某个不是您的遥控器之一的存储库中获取时,创建的唯一新参考是 FETCH_HEAD。为什么?
    【解决方案3】:

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

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

    一旦我将其更改为以下值,它就开始工作了:

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

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 2019-10-30
      • 2016-10-06
      • 1970-01-01
      • 2011-09-28
      • 2020-02-02
      • 2017-12-15
      • 1970-01-01
      • 2011-06-03
      相关资源
      最近更新 更多