如果我有多个本地分支跟踪远程分支foo
,那么
git fetch foo
获取跟踪它的所有本地分支的foo,或者只是获取时我所在的分支?
IOW,如果我切换到跟踪同一个遥控器的另一个分支,我是否仍然需要在我之前立即在另一个分支中取出遥控器?
我发现this thread与远程相关,但我认为这意味着--all
中的git fetch --all
意味着获取所有遥控器而不是获取远程当前本地轨道的所有本地轨道分支它跟踪。
答案 0 :(得分:1)
如果你有几个本地分支跟踪同一个分支,那么fetch
将获取所有分支或一个分支,因为它实际上只是一个远程分支。
假设您的远程分支是devel
,那么它将在本地命名为origin/devel
,您所有的本地分支机构将跟踪origin/devel
,这是唯一的。
因此,对于您的本地分支机构,您只需在git rebase origin/devel
之后git fetch origin
进行更新即可。所有本地分支机构都会在完全相同的提交上游。
答案 1 :(得分:0)
这已经得到了回答和接受,但我还是会添加此内容:git fetch remote
会根据&#提供指定的 remote
愿意为您提供的所有内容34;的Refspec"参数。如果没有refspec,它会使用fetch =
行中为该特定遥控器提供的refspec。
默认的refspec,如果你还没有配置,是:
fetch = +refs/heads/*:refs/remotes/origin/*
假设遥控器的名称为origin
(通常也是默认名称)。 1
您可以将两个git会话(您的git fetch
,以及提供数据的遥控器上的会话)视为具有某种电话会话。你们打电话给他们,并要求它提供所有参考文献的清单,以及随之而来的SHA-1 ID。他们可能会说"我有分支机构和分支机构开发#34; (使用一些SHA-1)"以及标签v1.0和v1.1" (使用更多SHA-1)。
此时,您的fetch
会浏览他们提供给您的列表,并挑选出所需的名称和SHA-1。他们将根据需要进行更多对话,选择完成与这些SHA-1一起使用的对象所需的所有底层存储库对象("提交" SHA-1需要"树" SHA-1需要更多的树和/或" blob&#34 ;;但您可能已经拥有了一些,大部分或全部)。然后,他们发送所有SHA-1标识的存储库对象,并将您的提取存储在您的存储库中。
最后,您的提取会使用相同的refspec更新 引用名称的副本。使用origin
的标准分支,这意味着每个分支 - 存储库中refs/heads/
下的每个名称 - 在您的存储库,但在refs/remotes/origin/
下列出。因此,您的存储库现在拥有他们在电话会话时所拥有的每个分支。开始了,但在您的回购中,这些被列为"远程分支"在origin/
下。
如果您已有名称,fetch
需要知道如果关联的SHA-1已更改,该怎么办。例如,他们的refs/heads/master
现在可能指向不同的提交SHA-1。对于分支有一些特殊的快进规则, 2 但要知道的主要事情是refspec前面的+
意味着"强制更新": +
中的+refs/heads/*:refs/remotes/origin/*
表示"全部更新,无论是什么"。如果没有+
,某些引用名称可能会指向原始引用。
如果您向--tags
添加git fetch
,则可以将refs/tags/*:refs/tags/*
添加到refspec集。这将所有标记带入refs/tags
下的(单个,全局)标记命名空间 - 但没有强制更新,因此如果您已经有amphibient-save
之类的标记, 将忽略具有相同名称的标记。 (如果你的Git是2.19或更高版本,请参阅VonC的脚注;我还没有测试过。)
这归结为:"默认情况下,git fetch会带来所有分支和所有有用的标记"。但是,具体知识很有用,特别是在边缘情况下。
1 tags
有一个特殊的黑客攻击:如果你没有明确要求你的fetch
带来所有标签,但你拥有再次询问分支机构,这是默认设置 - 它会查看哪些标签引用与您带来的分支相关,然后您的fetch
会使用这些代码更新您的代码,如如果您列出了refs/tags/tag:refs/tags/tag
。与--tags
一样,这是一个非强迫的"更新
2 当且仅当更新是快进时,非强制标记更新用于遵循允许更新的非强制分支更新规则。从git版本1.8.2开始,此行为已更改;标签现在仅在强制时更新,无论快进。