个人仓库 vs 中央仓库

6

我正在尝试设置版本控制软件,目前我是独自工作的(但我希望这种情况会改变),我想将代码存储在定期备份的网络驱动器上,但是在我的笔记本电脑硬盘驱动器上工作并使用相同的代码。

但是GIT让我很困惑!

所以从我理解的来看,我应该在我的笔记本电脑上创建一个个人仓库,然后将其推送或克隆到网络驱动器上的新中央仓库。这样做是否正确?是通过推送还是克隆完成的?

我正在使用GIT-Extensions,他们对于中央库有这个声明:

中央库只包含版本历史记录。因为中央库没有工作目录,所以无法在中央库中检出修订版。在中央库中合并或拉取更改也是不可能的。此类型仓库可以用作开发人员可以向其推送更改或从其中拉取更改的公共仓库。

所以这听起来像是正常的SVN仓库?就是说我可以从中获取代码,并将代码发送到其中,但它不能从我获取代码并强制给我代码?这听起来对吗?

但如果是这样的话,根据这个答案中的图表What are the differences between "git commit" and "git push"?,我的两个仓库将是哪个呢?他们会是工作区和本地仓库还是本地和远程仓库?这是否决定了我应该提交和检出还是推送和拉取?

2个回答

19
“GIT让我感到非常困惑!”
“您似乎来自于集中式版本控制系统的背景,并表现出Joel在here中所描述的知识诅咒的症状。您只需要接受Git分布式的本质,一切很快就会变得清晰明了。 :)
“Pro Git书中以下内容是一个好的起点,可以帮助您提高理解:http://git-scm.com/book/en/Getting-Started-About-Version-Control。”
“我应该在我的笔记本电脑上创建一个个人仓库,然后将其推送或克隆到网络驱动器上的新中央仓库。这样做是否正确?”
“Git本身并不对此作出任何规定,但是是的,这是一个被广泛使用的合理设置。”
“这是通过推送还是克隆完成的?”
推送意味着将您本地分支中的本地更改发送到位于另一个仓库中的某个分支,称为“远程仓库”。”
这个术语有些令人困惑,因为所谓的远程 repo 实际上可以位于与“你的存储库”相同的机器上。“远程”是 Git 中一个相对而非绝对的术语。应该将“远程存储库”理解为本地存储库知道的其他存储库。
克隆大致意味着获取远程存储库的本地副本(成为“你的存储库”)。
额外奖励:拉取意味着将某个远程存储库中存在的所有更改“下载”到“你的存储库”中。
你需要在网络驱动器上创建/初始化一个存储库,然后设置本地存储库,以便可以与其通信(推送、拉取等)。
我正在使用 GIT-Extensions,他们对于中央存储库有这样的说法:[...]
我认为 Git-Extensions 帮助文档中的这一段文字是误导性的。你认为的“中央”存储库可以是“裸”的(即仅包含版本历史,没有任何工作副本),但不一定是。
那么这听起来对我来说就像一个普通的 SVN 存储库?
Git是一种分布式的工具,这意味着所有的存储库都处于平等地位;没有必要有任何一个存储库比其他存储库更重要或更为中心。也就是说,你可以将某个特定的存储库视为中央/规范存储库。这是Git和集中式版本控制系统(如SVN)之间的主要区别之一。
“您的存储库”中发生的事情由您决定。如果您愿意,可以从另一个存储库获取更改或向其发送更改(假设您拥有对其的写访问权限),但后者不能从“您的存储库”获取任何内容,也不能强制执行任何操作,除非您明确要求……当然,除非控制该远程存储库的人对您的存储库有写访问权限。
但如果是这样的话,那么根据此答案中的图表:What are the differences between "git commit" and "git push"?,我的两个存储库会是什么?它们是工作区和本地存储库,还是本地和远程存储库?

虽然我觉得这个描述有点误导,但你可以初步考虑每个存储库由三个区域组成(参见http://git-scm.com/book/en/Getting-Started-Git-Basics#The-Three-States)。

  • 工作目录,或者更准确地说工作树(在你链接的图表中称为“工作区”)。广义上讲,它对应于你检出的副本,即坐落在文件系统中你项目树形结构中的文件体。
  • 存储快照/提交的地方,在《Pro Git》书中被称为“Git目录”,但我不是这个术语的铁粉。你可以将此区域看作是一个专门用于记录项目历史的相册。
  • 索引或暂存区是工作树和“存储快照/提交的地方”之间的中间层。请参阅在 Git 中“添加到索引”真正意味着什么?

enter image description here

你提供的图表上,工作区索引仓库是指“你的仓库”的三种状态;远程仓库的三种状态未显示;远程仓库只被描述为一个黑匣子。

这是否决定了我应该提交和检出还是推送和拉取?

提交检出是完全局限于“你的仓库”的操作。
  • 提交意味着对你的项目进行快照并将其存储在仓库中;此操作与从暂存区到“快照存储位置”传输数据相关。
  • 检出意味着获取现有快照的副本到你的工作树中,以便查看和处理它,并可能使你的代码朝完全不同的方向发展。
推送获取则意味着在“你的仓库”和某个远程仓库之间进行数据传输,但是方向相反:
  • 推送:将“你的仓库”-->远程仓库
  • 获取:将“你的仓库”<--远程仓库

拉取是指获取并自动集成从远程仓库获取的更改到“你的仓库”中。


1
@Dan,不用着急,如果有需要澄清的地方,请告诉我。 - jub0bs
抱歉,我以为我已经点赞了!如果回答好的话,我不会吝啬我的点赞。谢谢你指出来。 :) - McNab
1
谢谢,非常好的回答!我现在完全理解了分布式版本控制的整个概念。我有一个最后的问题:当我在本地电脑上启动一个新项目时,是否明智在解决方案文件夹中创建一个本地(或GIT扩展术语中的个人)存储库。然后在网络驱动器上(该驱动器已经备份到离线位置),从我的笔记本电脑上克隆我的新创建的存储库(作为GIT扩展术语中的中央存储库)。这个中央存储库现在只是用于离线备份,而不是协作者获取我的更改的目的,因为他们在推送时已经获取了它们? - Dan
如果您可以访问网络驱动器,最简单的事情可能是在那里创建一个空存储库。然后,您可以让本地存储库了解网络驱动器上的存储库(即,您可以将后者添加为前者的远程)。用于此目的的命令是git remote add<remote-name> <url-of-remote-repo>。之后,在您的本地存储库中,您将能够向网络驱动器上的远程存储库推送(并且,如果需要,从其中获取)。 - jub0bs
@Jubobs 谢谢!所以我的步骤是在网络上创建一个空项目文件夹,在笔记本电脑上创建一个本地仓库,然后将网络文件夹远程添加到这个新的本地仓库中。如果项目的每个成员都这样做,那么我们就可以得到彼此的推送,并且网络驱动器为我们提供离线备份? - Dan
显示剩余2条评论

3
如果您还没有远程存储库,您将需要将本地存储库克隆到远程存储库中。然后,您需要将其push到远程存储库。
您可以在本地存储库中很好地工作。当您完成修复时,首先将其commit到本地存储库中。然后您需要将其push到远程存储库中。
这一切起初听起来很混乱。想法是你可能想独立工作一段时间,进行大量的本地修复和提交,然后再考虑将工作推送到主(远程)存储库中,其他人从中获取最新更改。
有本地存储库的想法是,您可以拥有远程存储库的所有分支,甚至可以在本地存储库中创建更多自己的分支。您可以在自己的分支上开发功能,而不会影响其他人的工作或受到他们的影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接