很难理解git

我很难理解git-fetch的细微差别。 我明白,做一个fetch ,将远程参考资料提取到本地跟踪分支。

但我有几个问题:

  • 本地跟踪分支是否可能不存在? 如果是这样,它会自动创建吗?

  • 如果我执行fetch并将非跟踪分支指定为目标,会发生什么情况?

  • git-fetch的手册页指定:

    git-fetch <options> <repository> <refspec>
    
  • 我将如何使用refspec从我的远程主站获取内容到其远程跟踪分支? 我相信这可能是可能的,如果我现在的头是在主人,我跑

    git fetch origin master

    但是,我可以使用<+?src:dest> refspec来实现相同的目的吗? 我认为这会帮助我更好地理解这些概念。

    还有一个问题:

    我的.git / config文件具有以下用于抓取的行(仅显示相关行):

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

    有人可以解释这条线的意思吗?


    首先,没有这种局部跟踪分支的概念,只有远程跟踪分支。 所以产地/ master是在 产地回购远程跟踪分支。

    通常你会使用git fetch $ remote来更新所有远程跟踪分支,并在需要时创建新分支。

    但是,您也可以指定refspec,但不会触及远程跟踪分支,而是会取指定的分支并将其保存在FETCH_HEAD上,除非指定目标。 一般来说,你不想惹这件事。

    最后,

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

    这意味着如果你这样做

    git fetch origin
    

    它实际上会这样做:

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

    这意味着远程头部/ foobar将成为本地遥控器/原点/ foobar ,而加号意味着即使它们不快速前进,它们也会被更新。

    也许你认为跟踪分支是与git pull和合并配置相关的东西。


    在他的回答中,felipec回答了大部分有问题的问题。

    剩下的几个(大部分来自git fetch manpage;不幸的是这在有些地方有点过时):

  • 如果远程跟踪分支(跟踪某个远程存储库中的某个分支的分支)不存在,它将被创建。

  • 你取到分支(在<dst>[+]<src>:<dst>不需要驻留在remotes/<remote>/命名空间。 例如,对于镜像库( git clone --mirror ), git clone --mirror为1到1.在单独的远程布局之前(远程跟踪引用的远程remotes/<remote>/命名空间之前)master分支被取回到称为原点的分支中。 即使是当前的标签也是以镜像的方式直接进入tags/名字空间。

  • 如果您正在进入的分支(refspec <src>:<dst>的右侧确实存在,Git会检查下载是否会导致快进,即如果<dst>当前状态是<src>的状态祖先<src>在给定的远程仓库中,如果不是,并且你不使用-f / --force选项来进行git-fetch,或者给refspec加上'+'(使用+<src>:<dst> refspec)会拒绝更新该分支。

  • git fetch origin master相当于git fetch origin master: git fetch origin master:master而不是git fetch origin master:master ; 它将主分支(远程原点)的提取值存储在FETCH_HEAD中,而不是存储在主分支或远程跟踪remotes/origin/master分支中。 它可以跟着git merge FETCH_HEAD 。 通常不是直接使用,而是作为一次性拉动而不设置远程跟踪分支的一部分: git pull <URL> <branch>

  • +refs/heads/*:refs/remotes/origin/*作为remote.origin.fetch配置变量的值,意味着远程原点中的每个分支(ref in refs/heads/ namespace)都被提取到分别命名的远程跟踪分支中refs/remotes/origin/命名空间,例如原始主分支(即refs/heads/master ref)将被提取到原始/主远程跟踪分支(即refs/remotes/origin/master参考)中。 '+'前缀表示即使在非快速转发的情况下,抓取也会成功,这意味着在远程分支重新转换或重绕(重置为过去的某个状态)或以其他方式修改。

  • 旁注:您可能想要使用更高级别的git remote命令来管理远程存储库并获取更新。


    请注意,Git的主要维护者现在(Git 2.1,2014年8月)为git fetch添加了此解释:
    (见Junio C gitstergitster )的提交fcb14b0:

    配置的远程跟踪分支

    您经常通过定期和反复地从相同的远程存储库进行交互来进行交互。 为了跟踪这样一个远程仓库的进度, git fetch允许你配置remote.<repository>.fetch配置变量。

    通常这样的变量可能看起来像这样:

    [remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    

    这种配置有两种使用方式:

  • 当运行git fetch而没有指定要在命令行上获取哪些分支和/或标签时,例如git fetch origingit fetchremote.<repository>.fetch值用作remote.<repository>.fetch - 它们指定要获取哪个ref以及哪些地方参考资料需要更新
    上面的例子将获取origin中存在的所有分支(即任何与值左侧相匹配的ref, refs/heads/* ),并更新refs/remotes/origin/*相应的远程跟踪分支层次结构。

  • git fetch与明确的分支和/或标签运行在命令行上取,例如git fetch origin master ,所述<refspec> S上的命令行给出确定什么是要被取出(例如master在该示例中,这是这对于master:简写为master: ,这又意味着“获取' master '分支,但我没有明确地说出用它从命令行更新的什么远程跟踪分支”),并且示例命令将仅获取' master '分支。
    remote.<repository>.fetch值确定更新哪个远程跟踪分支(如果有)。
    以这种方式使用时, remote.<repository>.fetch值在决定获取的内容时没有任何影响(即,在命令行列表引用规范时,这些值不会用作refspecs); 它们仅用于通过充当映射来决定所提取的ref的存储位置。

  • 链接地址: http://www.djcxy.com/p/4427.html

    上一篇: Having a hard time understanding git

    下一篇: Playing 2 sounds together at same time