理解版本控制系统,第一部分

欢迎 Manish Sinha 加入写作团队!Manish 非常聪明,在从 Zeitgeist 到 Elementary 等各个领域都有工作经验。

嗨,天哪!Ubuntu!的读者们,这是我的第一篇文章。我将主要以社论的形式撰写有关技术主题的文章。

我的目的是用简单的方式解释棘手的技术问题,这对于那些想要成为贡献者的人来说很有用,因为他们发现由于某些工具的学习曲线陡峭而导致贡献过于困难。

协作可能是团队工作中最困难和最耗时的任务。当你第一次听到“版本控制”这个词时,你可能开始想到代码和程序员。协作问题不仅存在于程序员之间,还存在于其他领域和职业中,即设计、文档等。版本控制作为一种工具在编程圈内非常有名,但它的用途并不仅限于源代码。

当您与团队一起处理同一件事(例如类似的设计或一组文档文件)时,最大的问题可能是确保每个人都拥有最新的工作成果。当所有贡献者一起工作时,他们会对每个部分进行更改,然后需要共享这些更改。

解决方案?

一个解决方案是通过电子邮件互相发送更改,然后打开邮箱,迷失在 lolcat 图片或 reddit 中。跳过其中一些更改的可能性也很高,因为您可能最终会收到太多电子邮件。如果您和其他人更改了同一个文件,那么删除他/她的更改并将其合并到您的更改中可能是一场噩梦。

另一个解决方案是将所有更改发送给一个人,他/她将负责合并多个文件并保持文件最新。这需要一个人专门负责这项工作。真是浪费时间!

还有问题吗?哎呀!

您可能面临的另一个问题是,在某个时间点,您发现设计或文档的当前情况不太好,而 4 天前的情况看起来更好。您会怎么做?

查看某人 4 天前发送给您的文件。在您的邮箱中搜索这些文件,将所有零碎文件拼凑在一起,您可能仍然不确定您是否拥有正确的文件集。

如果有人问你:“你们在过去一个月里做了多少工作?”有时你可能想吹嘘你们作为一个团队做了多少工作,或者如果你是承包商或雇员,那么有一份工作记录会很有用。

总结主要问题

上述突出的主要问题是:

  1. 处理同一组文件的多人之间的协作
  2. 跟踪文件并恢复到某些保存点/里程碑。

这时版本控制系统 (VCS) 就派上用场了。我避免使用“源代码控制系统”这个词,因为它听起来好像只适用于源代码。VCS 巧妙地解决了上述两个问题。

简而言之,大多数 VCS 由两部分组成。一个中央服务器,团队的所有成员都将其用作一个公共区域,他们将自己的工作放在那里,并从那里获取其他人的工作。这是一种使自己与其他人同步的尝试。

第二部分,版本控制系统的客户端工具帮助您将您的工作推送到服务器,并从服务器中提取其他人的工作。

基础

获取您的副本

如果您是刚加入团队的人,您可能想要获取所有文件。在这种情况下,您将创建一组文件的克隆。

您向 VCS 客户端提供服务器的 URL,它将为您获取所有文件。然后您就可以开始处理这些文件了。

进行更改

对文件进行一些工作(修复错误、添加新功能等)后,您决定这项工作现在已经足够,并且想要与其他人分享这些更改。

VCS 客户端会跟踪所有文件。您可以要求它显示您更改了哪些文件以及您在这些文件中做了哪些更改。

保存更改

检查更改无误后,您需要提交更改。提交只不过是一个保存点或里程碑。代码库中可以有多个保存点。

检查并分析变化

您甚至可以找到第 3 次和第 4 次提交之间或第 23 次和第 25 次提交之间所做的更改。这是因为您的 VCS 知道文件的当前情况,并且还知道您进行第 23 次提交时存在哪些内容以及进行第 26 次提交时存在哪些内容。

在下面的屏幕截图中,我们展示了提交号 1714 和 1716 之间所做的更改:

提交后,您的 VCS 将告诉您没有待处理的更改。

发生这种情况是因为您提交了所有待处理的更改。在这种情况下,您需要在服务器上提交更改。这是通过将更改推送到您复制文件的远程 URL 来完成的。

与您的团队同步

推送后,您可能想知道在您进行更改并提交时是否有人推送了他们的工作。这可以通过要求您的 VCS 客户端从远程服务器提取更改来完成。

如果您发现团队中的其他人也推送了他们的更改,您可以在一段时间后尝试再次拉取。在开始处理文件之前拉取更改通常是一种很好的做法。这可能不是在每种情况下都需要的,但您总是会获得最新的更改,这通常更好。

在下面的屏幕截图中,我尝试提取更改并收到通知说没有更多更改。

笔记

这只是对版本控制系统的介绍。

我在快照中使用的是 bazaar(又名 bzr),它在 Launchpad 和其他一些地方(例如 GNU Savannah)中使用。

VCS 类别中的其他版本还有 Subversion、Git、Mercurial 等。

版本控制有两种:集中式和分布式。Bazaar 是分布式版本控制系统(DVCS)的一个例子。Git 和 mercurial 也属于这一类,而 Subversion (svn) 是一种集中式 VCS。

本文针对的是那些一直害怕使用任何版本控制系统的人,所以如果你开始吹毛求疵,就会犯很多错误!未来的文章将非常精确,并使用实际术语。

在未来的部分你应该期待:

  1. 什么是 git?
  2. Git 和 Bzr 使用图形应用程序而不是命令行
  3. 如何将 Bazaar 与 Launchpad 结合使用
  4. 集中式和分布式版本控制系统之间的区别

.. 还有很多。

谢谢!