“远程”是镜像还是外部存储库的引用?

时间:2018-01-01 17:44:19

标签: git

承担会议“origin”“master”
我的本地存储库有一个“master”分支。

“origin / master”是镜像还是引用?

git中有两种类型的远程存储库吗? 当我执行git fetch时,“origin / master”会更新 当我执行git pull时,“origin / master”和本地“master”会更新。

我读到git fetch更新refs / remotes //下的远程跟踪分支 但它对我来说不清楚。

实际上,我的本地仓库有两个远程存储库? 第一个是在GitHub中,另一个是我的“origin”

“origin”只是一个引用还是真正的存储库(镜像)?

当我执行git fetch时,我正在将最新的更改从远程存储库下载到我的本地存储库,但不是“master”,而是用于哪里?

在这张图片中,有3个存储库(本地,远程/原点和远程)
这是真的吗? enter image description here

2 个答案:

答案 0 :(得分:1)

"主"是分支的名称。 "来源"是远程存储库的名称。

执行git push时,您将本地主(或其他)分支发送到远程存储库(例如Github)。 当您执行git fetch时,您将从远程存储库(默认远程存储库调用" origin")的最新更改下载到本地存储库,但不将这些更改合并到本地&# 34;主"分支。

答案 1 :(得分:1)

  

承担会议"起源","主人"。   我的本地存储库是我的#34; master"。

不是。

origin是远程回购的本地视图的简写名称。
本地存储库(a.k.a。.git目录)的名称为.(点)。
master分支的名称,可能存在于您的本地,远程或两者上。由于它是第一个分支的默认名称,因此它通常存在于任何地方,但这不是必须的。

通常,当您克隆远程仓库时,origin会自动设置为指向该源远程仓库。但是,您可以将该名称更改为任何名称,也可以添加指示不同存储库的新名称。这通常被称为"使用多个遥控器"。如果您不感兴趣并且如果您处理默认设置,那么您只有一个远程目标,它的友好名称是origin,它是获取/拉/等操作的默认目标

  

git中有两种类型的远程存储库吗?

是的,但不是你的意思。按"键入"在"远程存储库类型"我可能意味着一种"类型的访问" (http / s,ssh,..),或者"类型的存储库" (裸露的,非裸露的)。这提供了许多远程回购的组合,但它几乎不相关,完全不是你想的。就你的想法而言,没有“存储库类型”和#39;除了一个本地仓库(.git dir)和遥控器(任何其他仓库,无论是公司服务器,on-github,on-hdd-in-different-directory,等)。

  

我也知道,git fetch更新了refs / remotes下的远程跟踪分支//但对我来说还不清楚。

远程跟踪分支是前面提到的远程存储库的本地视图

您当地的回购公司有分支机构,即' master'
远程回购称为“原产地”。位于GitHub上的可以拥有自己的主人,可能与你的版本不同。 您的本地仓库可能有一个名为origin/master的特殊自动分支,它可以记住最后一次看到的' master'在远程GitHub回购。

  

当我进行git fetch时,"起源"已更新。

"更新来源"非常不精确,甚至可以被理解为将提交发送到远程存储库,并且“推送”......

当您进行提取时,git会联系一个存储库(不一定是远程!)并读取分支状态并使用该信息更新您的本地分支。

例如:

# contact 'origin'
# read state of 'master' on `origin` *)
# update nothing on your local branches
git fetch origin master

# contact 'origin'
# read state of 'master' on `origin` *)
# update your local 'blaster' to match current remote master
git fetch origin master:blaster

# contact '.' (your THIS LOCAL repo)
# read state of 'blaster' on `.`
# update your local 'master' to match current local blaster
git fetch . blaster:master

*)每当联系任何非本地回购并学习一些新状态时,git可能会记住跟踪分支形式的新状态,如origin/master。请注意,这与origin mastermaster不同。通常,master是模糊的或隐含的本地的,origin master表示"远程端的主人" (即将连接以检查最近的状态),origin/master表示远程端"主人的最后已知状态" (没有连接,只使用我们之前通过检查已经知道的内容)。

  

当我做一个git push,"起源"和#34;主人"已更新。

与之前的陈述相似,这有点不精确。

当您执行推送时,将从本地存储库中读取分支的状态,并将其发送到目标远程存储库,并使用该信息更新其中的分支。在一个非常基本的术语上,它可以被认为与fetch直接相反。从某些内容读取,更新本地。推读本地,更新内容。

由于推送而更新的唯一内容是您指向要更新的远程端。好吧,以及追踪那个偏远方的跟踪分支 - 记住它已被更新。

例如:

# read state of 'master' on local
# contact 'origin'
# create/update the-target-branch**) on 'origin' to match local master
git push origin master

# read state of 'master' on local
# contact 'origin'
# create/update branch called 'blaster' on `origin` to match local master
# update tracking branch 'origin/blaster' to remember its new state
git push origin master:blaster

# read empty state
# contact 'origin'
# update branch called 'blaster' on `origin` to match .. empty
git push origin :blaster
# ^ this actually DELETES the branch 'blaster' from remote origin
# ^ and also deletes local tracking branches 'origin/blaster' if it existed
  

实际上,我有两个远程存储库?第一个是在GitHub中,另一个是我的"起源"?

不,你没有三个回购(第三个是你当地的回购)。除非"使用多个遥控器",否则你有两个回购:

  • local,on hdd,那个.git目录
  • 远程,在GitHub / etc上,由URL / path / etc指向,为了简洁而别名为origin
  

是"起源"只是一个参考或是一个真正的存储库(镜像)?

基本上只是一个参考,所以你不需要一直写URL。

但是,有跟踪分支。

由于跟踪分支记住了最后看到的远程存储库状态,因此它也是一个镜像,或者说是一个部分选择性镜像。 跟踪分支形成镜像。名为origin/master的跟踪分支会记住masterorigin的最后一次状态。根据您上次获取/拉/推的时间,它可能是5分钟前或5天前的状态。 master上的实际当前origin现在可能看起来不同,因为其他人可能已对其进行了修改。但是,您的本地跟踪分支origin/master会记住远程仓库的一个分支的确切旧状态。

单个跟踪分支会记住远程仓库的单个分支的最后一个状态。如果远程仓库有100个分支,而你只有一个跟踪分支用于origin / master,那么你肯定没有整个远程仓库的镜像。只是最后一个看到它的主分支的镜像。

由于您可以使用多个遥控器(=多个URL = origin1,origin2,archive,houseoffice等),因此管理所有这些的跟踪分支很快就会变成一团糟。因此,trackig分支按其指向的远程分组。 origin/master是跟踪分支的名称,但origin/部分是一个重要的前缀,意味着此跟踪分支引用由origin速记调用的远程仓库。

事实上,origin是一个名称,它至少有两个目的:

  • 它是完整网址的简写,表示各种操作的目标远程(git fetch origin master
  • 它是跟踪分支的分组名称(origin/masterorigin/develop

如果您的仓库中存在任何跟踪分支,它们将共同形成远程的部分镜像。

编辑:嗯,写这篇文章花了我很长时间,你在此期间又增加了一些问题。

  

当我进行git fetch时,我将最新的更改从远程存储库下载到我的本地存储库,但不是为#34; master",然后在哪里?

跟踪分支机构。我并没有明确表示它显而易见,但是很好,因为在你当地方面你只有一个回购,所有本地知识都存储在其中,然后是当地分支机构的状态,以及跟踪分支,两者都存储在您的本地仓库中。但那没有"两个存储库"。它是一个单一的存储库,它知道/记住你的分支和最后看到的某些远程分支。

  

在这张图片中,有3个存储库(本地,远程/原点和远程)   这是真的吗?

不,不是。它是跟踪分支的想法的简化,它试图将它们呈现为一个名为" remote / origin"的独立存储库。这可能是因为添加"工作目录"和"分期"要展示的东西..嗯...让我们说"数据流"由命令引起。

回购是回购。它不包含回购。 ***)除了裸露/非裸露的回购(除了你设置一个" git服务器"之前你不会知道它们存在),除了低级别的repo版本/布局(你几乎从不接触过,除非有些时候Git发生了重大变化),那么就没有特殊类型的回购。

只有存储库,多个存储库,位于不同的位置。

根据您所处的位置,您可以拨打其中一个本地,其他所有远程。在正常情况下,就是这样。这是唯一的"类型的存储库"。

所以,你只有两个repos:local和remote(除非你使用多个遥控器,你有1 + N:local,remote1,remote2,remote3,..)。

如果是这样,那么远程仓库与您当地的仓库相同。
如果您的本地仓库可以有一个工作目录,那么远程仓库也可以 如果您的本地仓库可以有一个临时区域,远程仓库也可以 如果您的本地仓库可以跟踪遥控器,那么远程仓库也可以 如果您的本地仓库可以使用多个遥控器,远程仓库也可以 等等..

当然,当您使用本地仓库时,所有其他都是遥控器,您无法轻松访问远程origin上的暂存区域或跟踪分支foobar/barbaz远程origin。但那里可能存在这些。也许使用一些低级别的命令,也许你可以从你的本地实际访问它们。也许你可以写一些类似git fetch origin refs/remotes/foobar/develop:develop-on-foobar-via-origin的东西。我真的不记得了。

无论如何,由于远程仓库是一个功能齐全的仓库,就像你的本地仓库一样,这就是为什么说跟踪origin/*这样的分支形成了第二个仓库"是胡说八道。 A"存储库"整个事情在一起:workingdir + staging + stash + localbranches + trackingbranches + config + reflog + ...,以及"远程回购的部分本地图像"不是存储库。它只是某种状态,你的本地回购记忆,以及它记得的许多其他状态和其他事情。

回购的每个部分它本身并不是一个存储库,但当然它们中的许多形成或包含一些或多或少的完整视图来表示你/他们的状态代码,即:

  • working dir包含一些代码状态
  • 每个本地分支包含*)代码的某些状态
  • 每个跟踪分支包含*)其代码的某些状态
  • 每个reflog条目包含*)某些代码的状态
  • 每个存储条目包含*)某些代码状态

但它们都不能真正被称为“存储库”。

实际上,他们不会包含"只有"记住"或者"指向" ..但那是关于git如何存储事物的另​​一个故事

***)有一些叫做子模块/子目录的东西,它在基础层非常直观,但让我们暂时离开,认真 - 配置和自动化提取/推送可能会变得复杂,如果fetch / pull / push / etc对你来说并不明显,那么立即在多个嵌套的repos上运行这些ops就不会讨论/解释了。说到子模块,还有一些称为子树的东西,与子模块完全不同的野兽,它们也允许类似于"在存储库中有多个存储库",但亲爱的,这些开始时非常复杂。远离子树,直到你觉得"高级"或"专家"在Git。