Git的本地存储库和远程存储库-令人困惑的概念


71

如果我理解正确,Git有两种存储库:一种称为本地存储库,另一种称为远程存储库。关于这两种存储库,我的问题非常幼稚。

说的正确吗

  • Git本地存储库是我们将对其进行本地更改的存储库,通常此本地存储库位于我们的计算机上。

  • Git远程存储库是服务器之一,通常是一台位于42英里之外的机器。

另一个问题:一些教程向我展示了此工作流程

  • mkdir myproject
  • cd myproject
  • git初始化
  • 触摸自述文件
  • git添加自述文件
  • git commit -a -m“

我看到这git init创建了myproject一个本地存储库。我不明白的是 git commit命令。如果尚未设置远程存储库,那么Git如何知道将README文件提交到哪里?

我希望我很清楚。

[编辑]我使用Git的方式可能与其他方式有所不同:我使用私有的Git存储库来备份代码。所以我认为我确实需要一个远程存储库。在这种情况下,本地存储库应该是无意义的。我对吗?感谢您的澄清。这些是我在其他任何地方都找不到的最幼稚的问题...


7
它将提交到您的本地存储库。Git不需要任何类型的“服务器”或集中式存储库。
2012年

3
如果您使用设置了本地存储库git init,然后提交了一个README文件-该文件已提交到本地存储库-根本就不需要远程服务器。
marc_s 2012年

2
正如@Mat和@marc_s所说,它将提交到您的本地存储库。如果要将内容推送到远程,则命令为git push <remotename> <branchname>。以前,您必须使用git add remote命令添加遥控器。
jbarros

Answers:


52

Git是一个分布式版本控制系统,它使Git很棒。您的本地存储库具有与其他任何Git存储库完全相同的特征。因此,服务器上的Git存储库与GitHub上的Git存储库相同(授予的GitHub添加了其他功能,但从本质上讲,您正在处理Git存储库),与同事的本地存储库相同。

那为什么很棒呢?因为没有中央存储库,所以您必须有权进行工作。即使没有Internet访问,您也可以在本地计算机上通过自己的存储库进行提交,分支和聚会。然后,当您再次建立连接时,可以将更改推送到您有权访问的任何其他Git存储库。因此,尽管大多数人将特定的回购视为中央回购(存储库),但这是一个过程选择,而不是Git要求。

所有这些的目的是要声明(就像其他人一样)您正在将自述文件提交到本地存储库。然后,只要您选择,就可以将更改从本地存储库推送到任何其他存储库。真漂亮!


66

由于我遇到了与您完全相同的问题(来自VSSTFS思维方式),并且在最近三天内开始了解。我相信,对于被困在那里的其他任何人,这些图对于了解整个图景都将更有帮助。

来自:https : //greenido.files.wordpress.com/2013/07/git-local-remote.png?w=696&h=570

Git流程图1

另一个来自:https : //wiki.lsr.ei.tum.de/lib/exe/fetch.php?media=nst/programming/git_flow.jpg&w=500&tok=e87798

Git流程图2


3
有用的答案。我来自TFS自己,我对本地回购协议并不满意-感觉这是不必要的额外步骤,可以将变更推向团队。
安德鲁·斯蒂芬斯

1
git pull被表示为从箭头remote repositoryworking directory?有人告诉我git pull对应于git fetchgit merge
Minh Tran

3
@AndrewStephens拥有本地存储库的好处之一是,您可以选择将哪些提交推送到远程。在本地存储库中拥有实验分支,而您从未将其推送到远程站点是很常见的。因此,只有您与团队共享的内容才能共享。也几乎不算额外的努力:一个git push命令就能解决问题。
Marnen Laibow-Koser

刚好有一个本地存储库,与工作区和远程存储库分开,但是我认为这与“本地索引”相同。从上面的图中可以看出,Index仍然是另一个实体。有人可以简单地解释一下“本地索引”是什么以及在何处[默认情况下,“本地存储库”似乎是在我的用户区域中的sources \ repos下创建的。另外,为每个Windows / VisualStudio解决方案创建单独的本地存储库是否合理/正常?
Zeek2

1
@ Zeek2索引(也称为暂存区域)是您在其中暂存更改直到提交更改的位置。git add分阶段更改(即,将其添加到索引中);git commit创建一个包含索引中所有更改的新本地提交,然后清除索引(因为索引中的更改现已提交)。
Marnen Laibow-Koser '19

15

您引用的陈述是正确的。

您根本不需要远程存储库。
您可以拥有完整的git经验,只需本地存储库,即可进行提交,分支,合并,变基等操作。

远程存储库(例如GitHub)的目的是将您的代码发布给全世界(或某些人),并允许他们读取或编写代码。

仅当git push您本地提交到远程存储库或git pull其他人从远程存储库提交时,才涉及远程存储库。


这正是我一直在寻找的答案。由于安全方面的考虑,我想使用带有本地存储库的Git而不是远程存储库。
Rene Duchamp

13

如果尚未设置远程存储库,那么Git如何知道在哪里提交我的README文件?

您将提交到本地存储库(这是一个具有自己的更改控制权的正确存储库;它不仅是本地签出,因为您是在本地创建的,所以它甚至不是本地签出!)。

如果您想将更改发送到远程存储库(以备份更改,将其提供给团队的其他成员或将其发布到全世界),则必须推送更改。


0

例如,在github上需要远程存储库实例仅是与其他程序员共享代码,因为他们只能访问您的git repo(除非他们使用IP连接到您的PC,否则他们只能访问您的更改) (但不包括其他程序员的更改),这就是为什么将更改从本地存储库提交到远程/中央存储库,以便其他开发人员可以将其签出,并最终获得与该软件相同的状态。但是最后,如果您是唯一的开发人员,则实际上并不需要远程/中央存储库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.