版本控制令我难过

时间:2009-09-24 00:14:11

标签: svn git version-control

我几年来一直在开发网站,我从来没有时间或精力去学习版本控制。现在,当我开始我开发的一个更大的项目时,我正在考虑最终采取这种方式,并将其作为学习版本控制的机会。

我已经阅读了几个简短的描述,但是我仍然在掌握集中式版本控制和分散版本控制的概念方面遇到了一些麻烦。有什么区别?优点/缺点?

我正在OS X上开发网站。在过去的几年里,我使用了一个名为Coda的程序来编辑我的HTML / PHP / CSS / JS,并通过简单的方式将其轻松上传到我的服务器Cmmd + S.我总是保留一个'dev'目录用于开发,以及一个'live'目录用于制作。推出修复程序和新功能一直都像使用'dev'中的最新更改更新'live'目录一样简单。但是,通过这个项目,我希望聘请一些外部设计师/开发人员来访问网站的特定方面,这也是我认为SCM的用武之地。而且,我第一次需要网站的测试版本。用户可以测试新功能并提供反馈。

据我所知,每次我想做出改变时,我都要分叉(?)我自己的工作副本。我没有将我的工作计算机设置为开发服务器(没有MySQL,PHP)。如何使用远程服务器作为开发服务器进行版本控制?我是否需要为每个开发人员提供工作目录?如何将版本控制与MySql或其他数据库结合使用?

此外,我在共享托管服务器上,因此我将使用托管版本控制系统,如BeanstalkGithub

我正在寻找整个工作流程。你做什么的?

我知道这是一个很大的问题,我非常感谢大家的意见。

5 个答案:

答案 0 :(得分:5)

它没有您想象的那么糟糕。

你会学会喜欢它,因为你永远不会丢失代码,你将能够跟踪历史记录,并且你将能够回滚到任何你喜欢的版本。

  

每次我想要做出改变时,我都要分叉(?)我自己的工作副本

事实并非如此。您可以随时提交对工作副本的更改,直到您准备发布它为止。您将标记并标记该版本(例如,“maj.min.svn.build”,其中major是主要版本号,min是次要版本号,svn是subversion版本号,build是自动构建号)并快乐地为你的下一个版本修改后备箱。

如果你正在进行并行开发,你只需要fork(“创建一个分支”)。

尝试Subversion。即使Linus Torvalds讨厌它也很不错。 “SVN红豆”一书就是Google应该阅读的内容。或者关于版本控制的实用程序员书。

我在家用机器上运行CollabNet Subversion并定期检查所有内容。这是一种很好的练习方式。我的东西是安全的这一事实是一个额外的好处。

答案 1 :(得分:5)

老实说,git是最简单的东西之一。颠覆现在有一个非常大的思想共享,很多一直在使用它的人都很难学习git(不同的是很难),但如果你没有经验,一个并不比另一个更难。

使用git的基本模型是你做了一些工作,并且记录了你的工作快照,并描述了它与前一个快照的不同之处。

看到这些快照中的任何两个之间的差异或者“回到过去”并在任何先前的点上查看项目的整个状态是微不足道的。所有这些操作大致是即时的,并且都不需要访问任何特定的服务器。

即时意味着你获得了新的实验自由。你永远不会害怕做一些疯狂的疯狂实验,包括删除所有的css文件和重新开始。如果它没有快速解决,你只需将工作扔掉然后再回去。但是,即使尝试这个也会让你真的很远。

我喜欢将这个描述为新手,这是一个管理良好的撤销加上一个非常棒的备份系统。当您将更改推送到另一个存储库(例如github)时,您实际上会在项目中拥有每个状态的两个副本。 很快就失去了工作

我想强调最后一点:如果你有一台计算机,你将快照推送到github,唯一可以丢失数据的方法是两者 github不可用(或以某种方式丢失了您的数据)您的计算机同时崩溃。如果您有两台计算机,则需要打破三个系统。如果你使用git在某处部署你的树,那么四台计算机就必须中断。

答案 2 :(得分:4)

Version Control with Subversion是一个免费的在线电子书,虽然它的目标是Subversion(效果很好),但这些原则适用于所有源控制系统。分支和合并章节清楚地解释了如何实现它。

有一个巨大的TFS白皮书,几乎涵盖了您可能遇到的每个场景:Microsoft Team Foundation Server Branching Guidance但我建议从上面的红豆书开始。

答案 3 :(得分:2)

一些场景来说明版本控制如何提供帮助:

您正与一位大型项目的开发人员Joe合作。大多数代码都依赖于一个类。你们两个决定研究看似独立的功能,但发现这个类需要更多的成员函数。在一个非版本化的场景中,Joe和你将聚在一起决定如何重构那个类以满足你的需求,而你们中的一个人必须在另一个人等待时最终编写它。在版本控制的情况下,你们两个可以根据你的需要在单独的分支合并中同时修改类 - 你只需要讨论一下是否存在冲突

你正在独立开展一个小项目。你开发了一个稳定的版本并发布了它。现在,你想要进行一些实验并重构很多东西 - 在某个地方,你会发现你已经走错了路,希望你可以回去几天(甚至几个月)。版本控制历史使这成为可能。

与两位主要开发人员和十位codemonkeys合作。主要开发人员设计项目的大部分架构,并为初级程序员分配小的可执行任务。他们希望定期审查初级程序员的代码。青少年可以定期推送到他们各自的分支,其中潜在客户将并进行审核。青少年可能需要大量的提交来完成他们的任务。这些潜在客户可以选择压缩几个提交,然后将分支集成到主线中,而不是包含项目历史中的所有琐事。引线找到了几行不好的代码 - 他们可以责备某人,因为版本控制系统总是跟踪谁做出了什么。

一个庞大的开源项目需要管理进度跟踪器,错误跟踪器,邮件列表,社区维基,讨论内容以及他们的版本化代码。 Launchpad是一个非常棒的平台,可以将这些东西紧密地集成在一起;提交对应于错误修复。可以通过标记神奇地发布一个版本。由于公众没有获得对主存储库的写访问权限,管理员可以接受邮件列表上的补丁:版本控制系统可以轻松地区分主项目和用户的代码,用于生成包含更改的修补程序。

  
    

据我所知,每次我想要做出改变时,我都要分叉(?)我自己的工作副本。

  

没有。你只需要提交。

  
    

我没有将我的工作计算机设置为开发服务器(没有MySQL,PHP)。如何使用远程服务器作为开发服务器进行版本控制?

  

没关系。保留存储库的两个副本 - 一个在开发服务器上,另一个在您的计算机上。通过将更改推送到开发服务器的存储库来保持它们的同步。

  
    

我是否需要为每个开发人员提供工作目录?

  

不,你只需要单独的分支机构。

  
    

如何将版本控制与MySql或其他数据库结合使用?

  

版本控制与数据库无关。您可以单独备份数据库。

  
    

我正在寻找整个工作流程。你做什么的?

  

细节取决于团队规模,项目要求等。否则,有一个开发分支,一个生产分支,以及为不同开发人员提供的几个分支。开发人员分支他们自己的分支来编写独立的功能,并将它们合并。生产分支从开发分支拉出,并具有各种版本的标签。通常,还有两个部署 - 每个人都在不断测试的开发,以及为公众制作的开发。

注意:我在这里使用了分布式版本控制系统术语,但同样的问题在集中版本系统案例中也有同样好的答案。

答案 4 :(得分:0)

您可能希望使用subversion,并且,除非您想将生产代码保存在自己的主干(如目录)中,否则您不必分叉新分支,因为您可以查看之间的差异您当前的代码和生产中的内容。

首先,您可以在计算机上安装subversion,然后检查更改。每当我完成一项功能时,我倾向于检查,所以如果我在进行另一次更改时完全搞砸了,只需恢复到上一个​​工作版本并再次开始执行该功能就会更快。