很难理解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 gitster
( gitster
)的提交fcb14b0:
配置的远程跟踪分支
您经常通过定期和反复地从相同的远程存储库进行交互来进行交互。 为了跟踪这样一个远程仓库的进度, git fetch
允许你配置remote.<repository>.fetch
配置变量。
通常这样的变量可能看起来像这样:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
这种配置有两种使用方式:
当运行git fetch
而没有指定要在命令行上获取哪些分支和/或标签时,例如git fetch origin
或git fetch
, remote.<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的存储位置。