一些基本的版本控制问题

时间:2009-09-24 03:22:08

标签: svn git version-control

...我不想分成几个问题帖子,因为我猜,它们是基本的,这里的大多数人都知道如何回答。

我已经开发了好几年了,而且我从来没有时间去学习版本控制。重命名具有不同版本名称的目录似乎总是足够的。现在,我终于决定学习它,但是一些基本的术语和工作原理仍然让我感到困惑。

我的项目相对较小,最多10个文件(虽然文件相对较大),并且以非OO方式完成。我经常采取一种方法,在某种程度上做到这一点,然后决定那样做,然后(重用旧代码)用完全不同的文件组织和内部代码组织完全重写整个项目。文件消失和出现在这些“版本”之间的新文件并不罕见。

所以这是我的“困惑”:
1)例如,如上所述,我已将第一个版本推入vc。然后我删除所有文件,并重新重写它们。如果我理解得很好,那将是一个新的“分支”,对吧? 2)如果我继续开发该版本,我会继续致力于“分支”吗? 3)vc保存,在分支中保存保存点时,所有文件都在,或者只是保存它们之间的区别?
4)我可以轻松地从分支中的某个保存点获取所有(整个项目)文件,还是我必须通过差异来跟踪它直到开始? (我只想说,“这里,这是保存点 - 复制你需要的所有文件,所以看起来像这样”) 5)用非常简单的术语来说,“推”和“拉”是什么意思。我不明白“推”/“拉”和“提交”之间的区别。

如果重要的话,我正在使用VS 2008,并且正在考虑使用git-extensions,因为我听说过很好的东西。它是一个很好的组合,考虑到上述情况,使用SVN(例如VisualSvn或Ankh)对我来说是更好的选择吗?

- 带着敬意, 彼得

8 个答案:

答案 0 :(得分:7)

您的部分混淆可能来自不同版本控制系统(VCS),它们使用不同的术语。

我通常会想到“行”中的代码。我从文件的原始版本开始,并将其保存到我的版本控制系统。将其放入VCS称为“签到”。版本控制系统用一些数字标记它,例如1.0版。现在我编译我的软件。它坏了,所以我必须编辑它。为此,我“检查”版本控制系统并进行编辑。现在它已修复,我将其重新检入并且版本控制系统将其存储为修订版1.1。我的老板想要一个新功能,所以我检查一下,编辑它,然后再次检查它,并将其存储为修订版1.2。

这是代码的“主线”或“主干”。

版本控制系统允许您通过指定版本号来获取文件的任何旧版本。假设我从基于修订版1.1的软件获得错误报告。我可以使用“diff”或任何比较工具来比较1.1和1.0,看看有什么变化。版本控制系统如何在内部存储它并不重要,我只是通过版本号来询问它,我得到整个文件。

接下来要理解的是,一组文件构成了您的项目或解决方案。当您要编译软件以将其发布到全世界时,您希望将“标签”与所有这些文件相关联,以便您可以将它们全部视为一个组。大多数人使用数字标签,如Windows 3.0,Windows 3.51等,但这只是惯例。如果你愿意的话,你可以标记一个版本“hardy heron”或“gutsy gibbon”。

现在,如果你是一个随时随地不断更新的人,这一切都很好。但是,假设您继续使用您的软件,然后发布版本7,然后是8版本,然后是9版本,现在您正在使用版本10.但是今天您将收到有关版本7的严重错误报告,您只需要修复它。因此,您转到VCS并请求标签为“版本7”的所有源文件。您可以将它们放入磁盘上的单独文件夹中,并修复该错误。但是当你去检查那些文件时,你需要它们成为版本7的一部分,因为你已经在版本8和9中添加了功能。这就是你创建一个“分支”。

一个例子可能更清楚。假设你检查了包的“版本7”,要修复的文件是修订版1.23。在版本10(您正在另一个文件夹中工作),您正在使用版本1.40。您不希望版本7的更改进入1.41,因为这会覆盖并破坏您在修订版1.24至1.40中添加的所有简洁功能。因此,您创建一个分支,并将更改的文件签入为修订版1.23.0.1。你编译它,现在修复了错误。现在您必须将其发布给您的客户。发布时,您将创建一个新标签。我将这个标记为“版本7.1”,这样我就能分辨出破碎的软件和固定软件之间的区别。而且我知道它没有版本8 +的所有功能。

如果你在一条线上绘制这些软件版本,你会想到一条直线从1到10的数字线.7.1适合这条线?它伸出一边,就像树枝从树干伸出一样。这就是我们得到“分支”和“主干”的名称。

答案 1 :(得分:2)

我认为你(以及任何不太了解版本控制的人)都应该阅读Eric Sink's articles这个主题。

答案 2 :(得分:1)

除非您需要为同一个项目分别处理两组不同的代码,否则您不需要分支。分支在团队环境中更为常见,其中大多数开发人员将在中继中处理长期功能,而一个或两个创建分支以更早地发布特定功能。然后,他们会将该分支合并回主干,因此所有代码都在一个地方。这只是一个例子......

我的建议只是建立一个Subversion存储库(理想情况下是在不同的服务器上,但如果它必须在你的机器上,它总比没有好),并在那里提交(推送)你的更改。您始终可以从存储库更新本地工作副本(pull)。

Subversion对文件执行二进制差异,因此它只保存差异,而不是整个副本。如果你在分支中有很多重命名/删除(特别是目录),这可能是一个问题,但如果你留在主干中应该没问题。

如果你担心这些问题,那么我推荐Mercurial或Git,它创建(克隆)存储库的整个副本(没有二进制差异)。如果你是一个GUI人,Mercurial现在有一个稍好的Windows用户界面。但是,Mercurial和Git没有与svn相同的集成工具(例如Ankh)。

我使用svn和Ankh for VS2008,一般来说,我喜欢它(特别是Ankh!),虽然我已经被svn中的目录删除/重命名问题烧了几次......

祝你好运!

诺亚

答案 3 :(得分:1)

  1. 不正确,这只是一个新版本。分支是您的修订流程在两个或多个方向上“分叉”的位置。这通常是一种特殊操作,与添加和删除文件不同。

  2. 和以前一样,你还没有分支。通常,您使用版本控制工具选择正在使用的分支。我强烈建议您查看有关您希望使用的工具的分支文档。

  3. 大多数versin控件工具只保存文件版本之间的差异。有些(特别是CVS)只对文本文件执行此操作,对二进制文件的更改将导致存储新版本的完整副本。请注意,这并不妨碍您在任何给定版本中获取完整文件,这完全取决于数据的存储方式。

  4. 您可以随时在任何选定的版本中获得完整状态。

  5. 使用集中版本控制系统(CVS,Subversion),您可以提交到存储库并从存储库中检出。使用分散版本控制系统(git,mercurial,darcs,bazaar),您可以克隆远程存储库(或创建自己的本地存储库),提交对该存储库的更改,然后您可以将更改集推送到其他远程存储库或从中提取更改集远程存储库。区别在于每个开发人员都有自己的存储库副本,并在其副本中生成更改集,并且其他人可以看到这些更改集需要被推送到其他人可以从中拉出它们的公共位置。 IBM对分布式版本控制概念有一个不错的introduction

答案 4 :(得分:1)

我相信你会发现这一点很有见地:An Illustrated Guide to Git on Windows

答案 5 :(得分:1)

1)分支完全在你的控制之下,SC系统不会让你感到惊讶(除了分布式系统中的多个头,但你的例子不应该导致它。)现在,如果你正在做一个重大的重组,您可以选择创建一个新的分支,以便您可以轻松地将它们分开,但这是您的选择。

2)如果您选择使用分支机构,您可以继续开发您喜欢的分支机构。只要您提交了更改,您就拥有了检查点,并且可以在它们之间自由移动。在某些情况下,您甚至可以在它们之间共享更改,但我不会立即解决此问题。

3& 4)大多数系统将节省差异作为空间经济问题,但它是一个实施细节。您可以随时检索任何版本,与提交时完全相同。

5)Commit正在设置一个检查点,您可以稍后返回。 Pushpull指的是您与其他服务器或存储库之间的更改共享;推送是你在某处发送更改,拉下载别人的工作。像Subversion这样的集中式系统意味着推送提交,并要求您与“拉动”保持同步。分布式系统允许(并要求)您单独执行每个部分。

答案 6 :(得分:0)

  例如,如上所述,我已经   将第一个版本推入vc。然后   我删除所有文件,并重写它们   重新。如果我理解得那么好   是一个新的“分支”,对吗?

您认为重写应被视为新分支是正确的,但您必须告诉您的版本控制系统您正在创建新分支。

  

2)如果我继续开发它   版本,我会继续提交   那个“分支”?

  

3)vc保存,保存时   分支中的保存点,所有文件,   或者它只是保存差异   他们之间?

我相信大多数版本控制系统都会在修订版本之间存储增量而不是整个文件,以节省磁盘空间。

  

4)我可以轻松搞定所有(全部   来自某个特定的文件   分支中的保存点,或者我有   通过差异来跟进它直到   一开始? (我只是想成为   能够说,“在这里,这就是   保存点 - 复制您需要的所有文件   所以它看起来像这个“)

大多数版本控制系统都允许您查看任何版本。

  

5)这是什么意思,非常   简单的术语,“推”和“拉”。一世   不明白的区别   在“推”/“拉”和“提交”之间。

分布式版本控制系统具有“推”和“拉”命令以上载或下载对远程服务器的更改,并具有“提交”命令以将更改保存到本地存储库。这与SVN形成鲜明对比,SVN只在服务器端存储修订信息,因此SVN可以“提交”到远程服务器。

答案 7 :(得分:0)

我会尝试依次回答你的问题。

  例如,如上所述,我已经   将第一个版本推入vc。然后   我删除所有文件,并重写它们   重新。如果我理解得那么好   是一个新的“分支”,对吗?

删除文件并从头开始重写不是分支的标志。想想一个主干和一个分支。一种常见的模式是保持代码在中继中进行持续(最新和最大)的开发。然后在某个时间点,您将要释放您的代码,此时您将拍摄主干的快照。这个快照是分支。

  

2)如果我继续开发它   版本,我会继续提交   那个“分支”?

是的,您可以独立开发代码中的代码和分支中的代码。

  

3)vc保存,保存时   分支中的保存点,所有文件,   或者它只是保存差异   他们之间?

从您的角度来看,只需将分支视为快照,而不是一系列差异。在内部,不同的产品以不同的方式实现分支,但您不必担心这一点。

  

4)我可以轻松搞定所有(全部   来自某个特定的文件   分支中的保存点,或者我有   通过差异来跟进它直到   一开始? (我只是想成为   能够说,“在这里,这就是   保存点 - 复制您需要的所有文件   所以它看起来像这个“)

重申一下,将分支视为文件的快照。

  

5)这是什么意思,非常   简单的术语,“推”和“拉”。一世   不明白的区别   在“推”/“拉”和“提交”之间。

sccs,cvs,svn,perforce,clearcase等系统维护资产的中央存储库。用户本地副本推送到存储库。在svn中,这是使用'svn commit'完成的。 git和mercurial等系统维护一个分布式资产存储库,用户从其他存储库中提取文件来更新自己的存储库。