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

86
如果我理解正确,Git 有两种仓库:一种称为本地仓库,另一种称为远程仓库。我的问题是关于这两种类型的仓库的极其幼稚的问题。
- Git 本地仓库是我们在本地进行更改的仓库,通常这个本地仓库是在我们的计算机上。 - Git 远程仓库是服务器上的仓库,通常在离我们 42 英里之外的机器上。
另一个问题:一些教程向我展示了这个工作流程
- mkdir myproject - cd myproject - git init - touch README - git add README - git commit -a -m ""
我看到 git init 创建了一个名为 myproject 的本地仓库。我不明白的是 git commit 命令。如果我还没有设置远程仓库,Git 如何知道在哪里提交我的 README 文件??
我希望我表达清楚了。
[编辑] 我使用 Git 的方式可能与其他人不同:我使用私有 Git 仓库备份我的代码。因此,在这种情况下,本地仓库应该是无意义的。我是对的吗?感谢您的澄清。这些是我找不到答案的最幼稚的问题...

8
它提交到你的本地代码库。Git 不需要任何形式的“服务器”或集中式代码库。 - Mat
3
如果你使用 git init 命令建立本地仓库,并提交一个 README 文件,该文件会被提交到本地仓库中,不一定需要远程仓库存在。请注意,此处不涉及任何远程仓库的内容。 - marc_s
2
正如@Mat和@marc_s所说,它会提交到您的本地repo。如果您想将内容推送到远程,则命令为git push <remotename> <branchname>。以前,您必须使用git add remote命令添加您的远程。 - jbarros
5个回答

86

3
有帮助的回答。作为一个来自TFS的人,我并不认同本地仓库的想法——它似乎是一个不必要的额外步骤,为了将更改推送给团队而存在。 - Andrew Stephens
1
git pull会被表示为从远程仓库工作目录的箭头吗?我被告知git pull对应于git fetchgit merge - Minh Tran
4
拥有本地存储库的好处之一是您可以选择要推送到远程的提交记录。在本地存储库中拥有实验性分支且从未推送到远程是非常常见的。因此,只有您想与团队共享的内容才会被分享。这几乎不需要额外的努力:一个“git push”命令就可以完成。 - Marnen Laibow-Koser
1
刚刚明白了本地仓库与工作区和远程仓库是分开的,但我以为它与“本地索引”是同一个东西。从上面的图表中,现在看来索引是另一个实体。请问有人能简单地解释一下“本地索引”是什么,它在哪里(“本地仓库”似乎默认在我的用户区域下的sources\repos中创建——这似乎是合理的)。此外,为每个Windows/VisualStudio解决方案创建单独的本地仓库是否合理/正常? - Zeek2
3
索引(也称为暂存区)是你将更改暂时放置的地方,直到它们被提交。git add 将更改添加到索引中;git commit 创建一个新的本地提交包含索引中的所有更改,然后清空索引(因为索引中的更改现在已经被提交)。 - Marnen Laibow-Koser

59

Git是一个分布式版本控制系统,使Git变得很棒。您的本地仓库具有与任何其他Git仓库相同的功能和功能。因此,服务器上的Git存储库与GitHub上的Git存储库相同(尽管GitHub添加了额外的功能,但在其核心中,您正在处理Git存储库),这与您的同事的本地存储库相同。

那么为什么这很棒呢?因为没有必须访问中央存储库来完成工作。即使没有互联网连接,您也可以在本地机器上提交、分支和提交您自己的存储库。然后,当您再次连接时,您可以将更改推送到任何其他可访问的Git存储库。因此,虽然大多数人将特定的存储库视为中央存储库(repository),但这是一种过程选择,而不是Git要求。

所有这些的重点是声明(如其他人所述),您正在将自己的README提交到本地存储库。然后,无论何时选择,都可以从本地存储库推送更改到任何其他存储库。非常漂亮!


24

你引用的陈述是正确的。

你完全不需要远程仓库。只拥有本地仓库就可以获得完整的git体验,包括提交、分支、合并、变基等功能。

远程仓库(例如GitHub)的目的是将你的代码发布到世界(或某些人)上,并允许他们阅读或编辑它。

只有在你使用git push将本地提交推送到远程仓库时,或者当你从远程仓库中git pull别人的提交时才会涉及到远程仓库。


这正是我在寻找的答案。由于安全问题,我想使用本地仓库而不是远程仓库来使用Git。 - Rene Duchamp

13
如果我还没有设置远程仓库,Git怎么知道在哪里提交我的README文件呢?
你正在提交到本地仓库(这是一个拥有自己的变更控制的正式仓库;它不仅仅是本地检出...因为你是在本地创建的,所以它甚至不是本地检出!)。
如果您想将更改发送到远程存储库(以备份它们,使它们可供团队中的其他成员使用或将其发布到世界上),则必须push它们。

0
例如,远程仓库实例在GitHub上的需求只是为了与其他程序员共享代码,因为他们不能直接访问您的git仓库(除非他们使用您的IP连接到您的计算机,即使如此,他们也只能访问您的更改而不是其他程序员的更改),这就是为什么要将更改从本地仓库提交到远程/中央仓库,以便其他开发者可以查看它们,并最终获得软件相同的状态。但是,如果您是唯一的开发人员,您不需要远程/中央仓库。

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