Git:从命名远程获取和从URL获取之间的区别是什么?

时间:2012-12-29 20:12:25

标签: git fetch

假设我从路径/path/to/repo克隆了一个git存储库。原始存储库将是一个名为“origin”的远程存储库。我可以使用命令git fetch origin从原点获取对象。这将从远程“origin”中检索所有对象,包括所有分支。

奇怪的是,如果我使用命令git fetch /path/to/repo从同一个存储库中显式获取,我似乎检索所有提交对象,但不检索任何分支。

为什么?在这两种情况下我都没有做同样的事情吗? Git的行为如何如此不同?

2 个答案:

答案 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