2014-02-21 155 views
0

所以我有点困惑于git fetch'ing。当我拿来一个遥控器上,它说,有5个新的分支:Git Fetch和本地分支

From https://github.com/*************** 
* [new branch]  ca***** -> ********** 
* [new branch]  ma***** -> ********** 
... 
* [new tag]   v***  -> v*** 

然而,如果我在我的本地系统上做了git branch,他们不存在。很明显,我不理解git fetch,阅读手册页并没有帮助我理解我对git的了解。有人可以给我一个简短的解释吗?

回答

1

git fetch你有“遥控器”。通常的第一个遥控器是origin,但可能还有更多。

一般情况下,人们有分支机构。

远程存储库通常是一个git存储库,这意味着它有分支机构。

假设您决定创建一个没有其他人正在使用的新分支供您自己使用。你巧妙地称它为branch。唉,现在乔有完全相同的想法,并称他的分支branch,他推送到您在origin共享的存储库。

然后你运行git fetch origin(或git fetch,使它达到origin,同样的事情)。而且......它让Joe的branch

你的分支怎么办?

答案是:什么都没有!这是关于git分支的伟大之处:您的本地分支机构是您的,而且您是独自一人,只有您可以影响他们。

但是,如果你想使用“他们的”分支?那么,当你的git咨询他们并获得“他们”分支的列表时,它将重命名为。如果您从origin处获取分支,并且在那里有一个名为branch的分支,git会将您的副本更改为“远程分支”,它将其命名为origin/branch。如果您拥有更多遥控器,则遥控器another上的分支branch变为another/branch

所以,origin/cawhatever是“复印”的“分支cawhatever”,在去年看到远程命名origin,最后一次使用Git有机会到那边去看看在那里。 Git在fetchpush操作上更新了这些操作(尽管在较旧版本的git中,如果以git pull的方式运行它,它会抑制“远程分支”的更新)。


完整的故事有点长:你的地方分支机构具有与refs/heads/开头的“全名”。这基本上是一个充满分支名称(和/或分支名称更多的子目录)的“目录”或“文件夹”。远程分支生活在“目录”下的空间refs/remotes/。这保证你和他们的人永远不会碰撞。但有时当你添加一个遥控器时,它可能会意外地与你所创建的分支有相同的名字。 (想一想,如果你创建了一个名为origin的本地分支,会发生什么情况!)在这种情况下,你必须拼出名称的较长形式(请参阅gitrevisions)。

标签生活在refs/tags/。没有内置的标签重命名,所以当你把它们的标签放进去时,它们就像你自己的标签一样进入相同的名字空间。这使得使用标签更加微妙,特别是如果您开始与多种不同的遥控器对话时。

不过,大多数情况下,只要将远程分支想象为“他们上次检查了什么”。您可以让您的(本地)分支“跟踪”远程分支机构,然后git status会告诉您“前方”和/或“后方”有多远,从您的存储库中“上次他们上次使用的内容检查”。

+0

哇,谢谢! – ForgetfulFellow

0

你应该做git checkout --track origin/<branch_name>然后做了冗长但可理解描述一个git fetch origin