版本控制和常用分支模型
Tony Deng
Tony Deng
版本控制是一种在开发的过程中对软件开发历史系统的跟踪的方法
在自己的或共享的文件系统中保留软件的不同版本的若干份Copy,并对这些Copy进行编号。
Git
计算机生成的文件就不必放入版本控制中了。如果放入的话,只能导致不同环境下项目出现不一致的情况。
如果是git
,我们可以选择用.gitignore
来忽略这些文件。
*.class
# Package Files #
*.jar
*.war
*.ear
#Eclipse Files#
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
**/tmp/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
基本上所有的版本控制系统都会在每一次更改的时候都会让你留下每次提交的备注,目的是解释一下你对提交的代码都做了什么?
千万别忽略这一步,一定要写,并且好好写
不光是为了别人而写,也是为了自己,认真细致的记录日志会迫使你梳理你的设计,看清问题所在,认清正在做的事情,也会使得想知道细节的人(同样包括未来某个时刻的你)与代码的作者有个交流。
把“做了什么”记下来,而不是“怎么做的”。要是“怎么做的”真的那么令人感兴趣,而且中修改本身很难去理解,当然有必要记一记,但是通常代码本身已经很能说明“怎么做的”了。要是真的有什么地方不清楚的话,一定是你的思路。
描述点滴所做。版本控制系统能帮助你找到你所做的更改,要试着将所有的修改都详细地告诉系统。推论:不要做自己都解释不清楚的事情。要将其分割成很多比较小的步骤,然后一个一个来做。
修改要小到原子理想的情形下,每次修改只包含一个意图,每条日志只是说明了一个问题的单句段落。有一条傻瓜法则用于判断两个相互关联的事情到底是一个还是两个原子修改:问问自己会不会有人只想撤销其中一个而保留另外一个。如果答案是肯定的,就要分开来提交。
不要改而不交拖延。修改的时间越长,你越容易忘了自己都做了什么,越容易产生bug,也越容易与其他人的相关工作不协调。要是你没有提交修改,其实一天的活就不算干完,除非你有更好的理由。
不能搞破坏。每一次你提交了代码,系统应该是好用的。也就是说,其他人此时更新代码后应该能够编译(可能的话),执行测试套件,并通过测试。将错误提交了是对与你协同的人(还是包括未来的你)极大的不尊重。这会让他们搞不清到底是因为自己的问题还是你提交的一些垃圾导致了系统不能运转。
要是你搞了破坏,要道歉,并立即修补。
试想一个场景:
假设我们是某个互联网公司的开发人员。我们正在进行一个长期的大项目开发,开发的结束日期可能是一个月以后,但是这个时候,由于正在运行的网站出现一些严重的bug需要紧急的修复;同时,市场部提出要在网站中加一段广告代码,以便进行网站推广,要我们尽快加入到系统中,这次推广要持续一周。
但是我们所有的代码只有一个版本。
那这个时候我们应该怎么来解决现在的问题呢?
所有的代码只有一个版本
嗯,还有一个版本,就是在生产环境上正在运行的代码
此种分支策略使用主干作为稳定版的发布。
主干上永远是稳定版本,可以随时发布。bug的修改和新功能的增加,全部在分支上进行。而且每个bug和新功能都有不同的开发分支,完全分离。而对主干上的每一次发布都做一个标签而不是分支。分支上的开发和测试完毕以后才合并到主干。
此种模式在采用敏捷开发模式(例如Scrum)的项目中广泛采用。
这些项目有固定的迭代周期(例如Scrum中每个Sprint的两周时间),新的功能开发都在Task branch(Feature branch)上进行,在接近迭代周期的发布阶段时候,新建Release branch来完成本迭代周期的发布,各Task branch(Feature branch)的功能merge到Release Branch中。在完成发布后,Release branch的功能merge到Trunk和尚在进行的Task branch中。
采用敏捷发布策略要求主干的版本:
此种模式较适合敏捷开发软件的要求,但对程序员及SCM要求较高。