承担会议“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”,而是用于哪里?
答案 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 master
或master
不同。通常,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中,另一个是我的"起源"?
不,你没有三个回购(第三个是你当地的回购)。除非"使用多个遥控器",否则你有两个回购:
.git
目录origin
是"起源"只是一个参考或是一个真正的存储库(镜像)?
基本上只是一个参考,所以你不需要一直写URL。
但是,有跟踪分支。
由于跟踪分支记住了最后看到的远程存储库状态,因此它也是一个镜像,或者说是一个部分选择性镜像。 跟踪分支形成镜像。名为origin/master
的跟踪分支会记住master
上origin
的最后一次状态。根据您上次获取/拉/推的时间,它可能是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/master
,origin/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 + ...,以及"远程回购的部分本地图像"不是存储库。它只是某种状态,你的本地回购记忆,以及它记得的许多其他状态和其他事情。
回购的每个部分它本身并不是一个存储库,但当然它们中的许多形成或包含一些或多或少的完整视图来表示你/他们的状态代码,即:
但它们都不能真正被称为“存储库”。
实际上,他们不会包含"只有"记住"或者"指向" ..但那是关于git如何存储事物的另一个故事***)有一些叫做子模块/子目录的东西,它在基础层非常直观,但让我们暂时离开,认真 - 配置和自动化提取/推送可能会变得复杂,如果fetch / pull / push / etc对你来说并不明显,那么立即在多个嵌套的repos上运行这些ops就不会讨论/解释了。说到子模块,还有一些称为子树的东西,与子模块完全不同的野兽,它们也允许类似于"在存储库中有多个存储库",但亲爱的,这些开始时非常复杂。远离子树,直到你觉得"高级"或"专家"在Git。