假设我从路径/path/to/repo
克隆了一个git存储库。原始存储库将是一个名为“origin”的远程存储库。我可以使用命令git fetch origin
从原点获取对象。这将从远程“origin”中检索所有对象,包括所有分支。
奇怪的是,如果我使用命令git fetch /path/to/repo
从同一个存储库中显式获取,我似乎检索所有提交对象,但不检索任何分支。
为什么?在这两种情况下我都没有做同样的事情吗? Git的行为如何如此不同?
答案 0 :(得分:5)
命名远程使用他们的配置,在获取此远程时设置refspec
模式:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = /path/to/repo
所以,这两种格式是等价的:
git fetch origin
git fetch /path/to/repo +refs/heads/*:refs/remotes/origin/*
基本上:git fetch <path> <source>:<destination>
。目的地在这里很重要,因为它是存储远程HEAD和分支指针的地方。
通过执行git fetch /path/to/repo
,您不需要设置任何refspec。因此,它只提取提交,而不是对象,因为没有指示git
获取和存储它们。
这里可能有一些细节或命名约定不正确,随时可以编辑。但全球的想法应该是正确的
答案 1 :(得分:2)
主要区别在于从URL获取不会将远程存储库中的分支状态存储到远程跟踪分支(例如refs/heads/master
即远程master
中的origin
分支到{ {1}}又名refs/remotes/origin/master
),但仅限于 origin/master
。
在一次性 拉 中使用网址而不是通过FETCH_HEAD
设置远程网址,即:
git remote add