Git是分布式源代码管理系统吗?

7
我是一个有UNIX SCCS和Microsoft Visual SourceSafe经验的Git新手。我正在学习Git,但它似乎有一个巨大而痛苦的学习曲线。我已经看到Git将我没有提交的数据文件全部删除,这让我很担心。(一个实用程序如何在没有警告的情况下删除数据文件是我无法理解的)。
Linus Torvalds在他关于Git的视频中声称Git是分布式的,并宣传了分布式的好处,但除了每个人都有源代码的副本(克隆)之外,他并没有真正解释分布式是如何工作的。
Git如何帮助分发? Git如何帮助恢复丢失的文件? Git分发是如何工作的? 我能找到文件被分发到哪里吗? 是否有Git分发教程?
提前致谢!

4
如果你不使用 git clean 显式地删除,Git 不会删除工作目录中未被追踪的文件(即使使用 git clean 也需带上 -f 标志才能删除任何东西)。 - mipadi
1
请参见https://dev59.com/u3RB5IYBdhLWcg3wXmNI#645771,了解线性版本存储(ClearCase,但类似于SCCS)与像Git这样的DAG VCS(有向无环图版本控制系统)工具之间的区别。 - VonC
...或者,如果你执行了 git reset --hard - pioto
2
@pioto:git reset --hard 不会删除未提交的文件。 - mipadi
1
@mipadi:这可能是“hadn't committed”被草率地用来表示“没有提交修改”的情况。但重点仍然是,git没有删掉任何东西。OP运行了一个命令,该命令完全按照文档所述执行,很可能是像pioto建议的reset --hard命令。 - Cascabel
4个回答

3

阅读这篇文章:http://www.newartisans.com/2008/04/git-from-the-bottom-up.html


至于您的其他问题:

Git是如何工作的?

这个问题不够具体,无法回答。但通常来说,Git通过创建对象并将它们放入树中来工作。这些对象对应于您对内容所做的更改。树本身也是对象。Git跟踪的是代码库中内容所做的更改。

分发是如何工作的?

因为所有仓库都可以作为服务器,不同的仓库可以比较它们的树和对象,并确定另一个仓库的当前状态和这个仓库之间的差异。因此,它们能够从/推送到其他仓库。

它有什么用处?

如果您不知道它如何帮助您,请坚持使用MVSS。


我认为可能存在词汇问题。分发不是指出货。Git的分发意味着每个仓库都是一个服务器。这并不意味着它将跟踪从哪里克隆过来(尽管您自己的仓库可以保持从中拉取/推送的远程仓库列表)。

阅读我提供的链接中的PDF文件。然后按照他们的指示创建一个github仓库。Fork别人的仓库,任何一个,只是为了看看它是如何工作的。


1

Git和Mercurial都遵循处理SCM分布式特性的非常相似的模式。我无法评论好的Git教程,但是有一些关于Mercurial的优秀作品。

理解Mercurial - 这里有关于你所问的确切问题的好信息...它被分布式意味着什么?

Mercurial书籍 - 用于更深入的研究。


1

Git和其他分布式版本控制系统基本上将整个代码库“带”给用户。当我有一个git工作副本时,我也在本地硬盘上拥有整个代码库。除了我可以通过git系统提供的各种工具和方法共享它之外,没有其他人可以访问它。

其他系统(例如Linus在视频中提到的SVN)将整个代码库放在单个服务器上。每个人都从该服务器推送和拉取。

再次看git,我的提交仅限于我的计算机。当我准备好让其他人拥有它们时,我会以某种方式“发布”我的添加 - 也许是在像SVN这样的中央服务器上,但那只是一个选项。我可以通过电子邮件发送我的更改。

防止数据丢失

防止数据丢失的一个角度是,如果我拥有整个代码库的副本,而您也拥有整个代码库的副本,如果我们中的任何一个人丢失了硬盘,我们都可以重新克隆代码库。当然,这假设我们正在交换进展并朝着共同的目标努力。

与 SVN(或其他中央仓库)相比,如果您丢失服务器硬盘,则必须从上次备份还原存储库如果您有备份。这意味着需要有人管理服务器并确保备份正在运行等。分布式版本控制系统在某种程度上天生就具备这种功能。
当然,这也存在由于意外文件删除等错误而导致的数据丢失问题,但这适用于所有版本控制系统。

我认为在这里强调一下DVCS中的“分布式”一词非常重要,它确切地意味着多个人拥有存储库的克隆;Linus在那个视频中确实解释了分发是如何工作的。 - Cascabel

-2

你可能切换到了不同的分支。运行git branch查看你有哪些分支,然后运行git co <branchname>

个人而言,我真的很讨厌git。它有一个巨大的学习曲线和奇怪的命令行界面。但现在它是首选的版本控制工具。所以享受吧!哦对了,除非你必须使用,否则不要学习VSS,因为你会养成非常非常糟糕的习惯。VSS是所有源代码控制工具都不应该有的。


1
除非他使用了stash,否则它不允许他在有未提交更改的情况下切换分支。 - Tesserex
如果您在Git中有未提交的更改并切换到另一个分支,它将携带这些更改到新分支。因此,这不可能是问题所在。请查看此示例:https://gist.github.com/905515 - thekindofme

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