为什么我应该使用版本控制?

126

我看了一篇博客,作者说:

"除非代码提交到版本控制系统,否则它不存在。在你做的每件事情中都使用版本控制。任何版本控制工具,包括 SVN、Git,甚至是 CVS,都要精通并使用它."

我从未使用过任何形式的版本控制,也不觉得它有多好。我之前搜索过并查看过相关内容,但我需要用通俗易懂的方式理解它。

目前我理解的是,像 SVN 这样的东西是为了将你的代码存储在线上,以便一组用户或其他开发人员可以访问相同的代码。一旦你更新了某些代码,你就可以提交新版本,SVN 将保留旧版本和新版本的副本。

这是基本概念还是我完全理解错误呢?

如果我理解正确的话,它可能对我没有太大用处,因为:

  • 我没有其他人在共同开发该代码。
  • 我不打算让别人使用该代码。

4
你的意思是你正在阅读《编码恐怖》? - Jason
54
许多开发人员(通常是在职业生涯的早期阶段)都持有这种观点,而只有当你强制要求他们使用源代码控制时,才会开始在他们的头脑中展现好处,这是一个奇怪的现象。 - spender
4
举手不羞愧的人有谁? :) - spender
4
有人向 @TimEckel 展示了一个二分法,版本控制神奇地指出从三个月前开始的三行代码更改,并说“错误是从这里引入的”。令人震惊。 - Jonathan Hartley
5
@TimEckel,你仍在使用版本控制,只是另一种功能较少的类型。 - Abhinav Gauniyal
显示剩余8条评论
20个回答

270

您有没有:

  • 修改了代码,发现错误后想要还原?
  • 丢失了代码或备份过于陈旧?
  • 需要维护多个产品版本?
  • 想要查看两个(或更多)版本的代码差异?
  • 想要证明某个更改损坏或修复了一段代码?
  • 想要查看某些代码的历史记录?
  • 想要提交针对其他人代码的更改?
  • 想要共享您的代码,或让其他人处理您的代码?
  • 想要了解正在进行多少工作,何时以及由谁进行的工作以及在哪里进行的工作?
  • 想要尝试一个新功能而不干扰工作中的代码吗?

在这些情况下(当然也包括其他情况),版本控制系统应该会让您的生活更加轻松。

误引用一个朋友的话:“一个文明的工具,用于一个文明的时代。”


20
这个人做得很好。即使我一个人在项目上工作,我也更喜欢使用一些版本控制系统。Perforce的可以供两个用户完全使用的演示版非常适合这个需求。 - Almo
3
听起来很有用... 直到我需要学习和精通它。呵呵 - potasmic
7
好的观点。然而,请注意:版本控制并不是备份!备份存储在另一个系统/媒体上,并保留旧备份一段时间(以防您的存储库出现问题)。 - sleske
7
嗨,Tim,你是怎么跟踪你的更改历史的?你如何将更改历史链接到问题追踪器或发布说明?你如何管理合并不同分支的代码?你如何找到你在过去 100 个版本中所做的更改?如果你是一个人写代码或者从不关心为什么要改动代码,那么只需要备份可能就足够了,但我敢打赌,一旦你使用了一个不错的版本控制系统,你就会理解为什么那么多人使用它们。 - si618
1
如果你有一个简单的工作流程,像那样没有分支,只有一个开发者,那么使用源代码控制发布就像在编辑器中按一个按钮将你的工作保存到存储库一样简单。不需要学习复杂的命令行。 - dan carter
显示剩余3条评论

58
即使你是单独工作,也可以从源代码控制中获益。以下是其中一些原因:
  • 你不会失去任何东西。我再也不会注释掉代码了。我直接删除它。这样不会让屏幕混乱,也不会让代码丢失。如果需要,我可以通过检出旧的提交来恢复它。

  • 你可以随意尝试。如果它没有解决问题,就还原回去。

  • 你可以查看先前版本的代码,找出错误是何时和在哪里引入的。git bisect 在这方面非常好用。

  • 更高级的功能如分支和合并让你可以拥有多条平行的开发线路。你可以在两个同时进行的功能中工作,而不会互相影响,并且可以轻松地切换回去。

  • 你可以看到“改变了什么”。这听起来很基础,但我发现自己经常要检查这个。我经常会以这种方式开始我的单人工作流程:昨天我做了什么?

放心去尝试吧。从基本功能开始慢慢学习其他功能,你很快就会发现自己再也不想回到没有版本控制系统的“黑暗时代”了。

如果你想要一个本地的版本控制系统,你可以设置自己的subversion服务器(这是我以前做过的),但是今天我会推荐使用git。它更简单。只需进入你的代码目录并运行:

git init

欢迎加入我们的俱乐部。


那听起来不错,所以它可以是本地的,不必在网络上供任何人查看?我使用php设计师,我喜欢它,并且它具有Tortoise SVN的集成,不确定是否是一个好选择。 - JasonDavis
1
只要找到一个开始的地方,然后当你学到一些知识时,查阅其他选择并尝试它们中的一个,然后再尝试另一个,以此类推。 - 1800 INFORMATION
5
+1 对于永远不要注释掉代码的建议点赞 - Ed Schembor
2
@jasondavis 针对你的具体问题(即使你现在可能已经知道了),你可以在本地使用任何分布式VCS(git,Mercurial等),而无需服务器。您还可以在本地使用集中式VCS(CVS,SVN等),但是设置起来会更加麻烦,并且不会提供太多好处。无论您使用哪种VCS,都可以将其放在服务器上,但仍不会公开(有助于在计算机之间传输,并提供另一种备份)-搜索“私有存储库”。您不能使用TortoiseSVN与git,但是有一个Tortoise-Git可以使用。 - naught101

17

版本控制是一种稀有但绝对必需的工具,即使您只是作为单独的开发者使用它。有些人说这是一种你生死相依的工具,我同意这个说法。

你可能现在正在使用版本控制,即使你不知道它。你有没有任何一个文件夹上面写着 "XXX Php Code (December)" 或 "XXX.php.bak.2"?这些 就是 版本控制的形式。一个好的版本控制系统将自动地帮你处理这些内容。你可以回滚到任何一个时间点(只要你已经检入了数据),并且能够看到那个时间点的精确副本。

此外,如果你采用像子版本这样的系统,并使用远程存储库(例如你拥有的服务器上的一个存储库),你将有一个地方来保留你所有的代码。需要在其他地方备份你的代码吗?没问题,只需检出即可。家里的硬盘崩溃了?至少与源代码无关(不是问题)。

即使您现在不使用版本控制,您将来可能会使用它,并且从现在开始变得更加熟悉其原则会带来好处。


17
...或者“Copy of Copy of Copy of MyWork” - spender
1
@spender:没错,那正是我在开始使用版本控制之前记忆中的黑暗岁月。 - Robert Venables
这听起来非常有用,我的当前项目相当大,至少有150-200个文件,这是如何工作的?我听说“版本”,这是否意味着像版本1和版本2这样的版本号递增?如果我修改了一个文件而不是其他文件,那么我会有200份未修改代码的副本还是只有修改过的文件的副本? - JasonDavis
1
只有您的更改差异才会被存储,因此如果您更改一个文件中的一行,那么在该版本中只会存储这一行。版本控制中的文件可以视为其所有更改的总和。 - spender
1
我穿越时空来纠正上面的评论:版本控制不一定只存储增量,而是将版本表示为增量。 - henrebotha

14

即使是独自工作,这种情况有发生过吗?你运行应用程序,但某些功能无法正常工作,你会说“昨天还好好的,我发誓没有碰过那个类/方法。”如果你经常检查代码,快速的版本差异比较能够准确地展示最近一天里发生了什么改变。


或者,我只需从备份中拉取最新版本,这些备份是在每次保存文件时创建的。 - Tim Eckel
@TimEckel和其他一些人只是撤销了他们的更改 :) - Abhinav Gauniyal

13
以下情景可能有助于说明即使您独自工作,源代码控制的有用性。
您的客户要求您对网站进行大规模修改。这项任务需要花费您几周时间,并涉及对许多页面的编辑。您开始动手工作。
当您完成此任务的50%时,客户打电话告诉您放下手头工作去紧急处理网站上的较小问题。您还没有完成大型任务,因此它还没有准备好上线,而客户无法等待较小的更改。但是他也希望将这个小更改合并到您对大型更改的工作中。
也许您正在另一个包含网站副本的文件夹中工作。现在,您必须想出一种可以快速部署的方法来完成较小的更改。您拼命地工作并完成了它。客户回电后提出进一步的改进请求。您也做到了这一点并进行了部署。一切都很好。
现在,您必须将其合并到主要更改的工作中。您为紧急工作做了什么更改?您工作得太快以至于无法记笔记。现在,由于两者相对于您开始的基线都有所改变,您不能轻松地对比两个目录。
以上情况表明,即使您独自工作,源代码控制也可以成为一个很好的工具。
• 您可以使用分支来处理长期任务,然后在完成后将分支合并回主线。 • 您可以比较整个文件集与其他分支或过去的修订版本,以查看有何不同。
• 您可以随时间跟踪工作(顺便说一下,这对报告和发票非常有用)。
• 您可以根据日期或您定义的里程碑恢复任何文件的任何修订版。

对于个人工作,建议使用Subversion或Git进行版本控制。任何人都可以自由选择其中一种,但无论哪种都比不使用任何版本控制要好得多。Mike Mason的"Pragmatic Version Control using Subversion, 2nd Edition"或Travis Swicegood的"Pragmatic Version Control Using Git"都是很好的书籍。


原作者:Bill Karwin


10

即使只有一个开发者,源代码控制也具有巨大的好处。它允许您存储代码历史记录,并随时恢复软件的以前版本。这使得您可以毫无顾虑地灵活尝试,因为您始终可以还原到正在运行的另一个版本的源代码。

这就像拥有一个巨大的“撤消”按钮,一直回到您的第一行代码。


7

一旦你开始使用版本控制,就几乎无法离开它。如果有多个开发人员在同一个代码库上工作,它是不可或缺的...但对于单个开发人员也非常有用。

它跟踪您的代码更改,并允许您回滚到以前的版本。它使您可以自由地尝试新的东西,因为您知道如果出现任何问题,您可以撤消更改。


1
我认为版本控制很慢、效率低下,而且会妨碍开发。更容易的方法是设置一个自动化的云备份,自动保存最近的100个更新文件。不需要获取、推送或同步任何东西,只需编写代码即可。 - Tim Eckel

5

使用版本控制工具可以保证代码的备份和版本管理(假设你养成了经常提交更改的习惯)。即使没有其他人与您一起开发代码,这两点也非常有用...


3

版本控制对于检查以前的版本非常有用,即使您是独自工作。例如,如果您意外删除了代码或文件,可以将其找回;或者您可以比较以前的版本,看看为什么会出现新的错误。如果您是一个人在多个位置工作,这也很好。

我个人最喜欢的是git。


3

即使您是唯一接触代码的人,使用版本控制也有很多好处。

  • 备份 - 如果您的硬盘崩溃了怎么办?您有备份吗?
  • 修订历史 - 您现在是否将代码复制到不同的文件夹中?版本控制可以让您跟踪您的更改,并轻松地查看不同版本之间的差异,合并,回滚更改等。
  • 分支 - 有能力测试一些更改,仍然跟踪您正在做的事情,然后决定是否要将其保留并合并到主项目中,或者只是扔掉它。

如果您将代码保存在版本控制下,则可以轻松查看您已更改的文件(或忘记添加到基线的文件)。


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