在前面的某篇博文中,我们简要介绍了如何使用Xcode进行简单的工程和代码管理的方法。实际上,Xcode自带的版本控制工具的功能并不是非常完善,而且使用体验同大部分主流的版本控制工具也有较大的差异。所以,我们还是有必要专门研究一下使用Git的强大功能对版本进行管理的方法。
参考资料:《Git权威指南》第1、2章,机械工业出版社。
1、我们为什么要进行代码的版本控制?
在我读硕士的几年中,研究方向主要是视频信号处理与编解码,主要内容是研究国产视频编码标准AVS/AVS+的算法与应用工作。同H.264、HEVC类似,AVS同样提供了相应的参考代码,采用Visual Studio进行编译。对于我们自己开发或者改进的算法,需要集成到参考代码中来对目标测试序列进行测试编码并评价算法的效果。在这个过程中,原始的参考代码要经过多次的修改,由于缺乏代码版本控制软件的支持,各种奇葩的代码版本层出不穷,只能把每个版本的代码拷贝一份,用一个奇长无比的文件名命名,如“20110729-FastMEBasedOnXXXX-Version1”等等……不但造成了代码逻辑混乱,而且对存储空间的浪费也是非常严重。另外,由于不可能随时对代码进行记录和回退,所以在发生某些bug造成了整个工程出错且无法修复的时候,只能放弃几天的工作重新来过,使得效率极其低下。所以彼时就对一个趁手的版本控制工具极其渴望。
后来,又发生了几件事情,使得引入版本控制工具成为了当务之急。开发用的电脑经过了几年的摧残,终于不堪重负地宕机了。经过检测确定是硬盘损坏且难以修复,结果造成了大量的数据的丢失,多个开发多日的工程毁于一旦。痛定思痛,决定马上着手进行版本控制工具的研究,以求彻底杜绝类似事件再次发生。
2、为什么使用Git
目前比较常用的版本控制工具除了Git之外,还有SVN、hg等等,尤其是SVN的应用较为广泛(比如现在HEVC的参考代码hm还在由SVN管理)。相比于集中式的版本控制工具SVN,分布式版本控制工具Git具有多种优势,具体不再赘述,网上一搜便知。
既然选择了Git,那么主要就要看一看Git的作用与优势。
首先,最重要的自然是保存、备份刚刚未提交的修改。主要分为两个步骤,即提交和推送两个操作分别用以下两个步骤执行:
$ git commit $ git push
其次,使用Git强大的分支作用实现对不同任务进行管理。例如,在研究不同的课题的时候,可以在同一套代码库中设置不同的分支来实现不同的开发工作。比如我们在研究HEVC的过程中实现了一种新的帧内预测快速模式选择算法,此外还实现了一种新的高效正交变换技术。有了Git提供的分支功能,我们不需要先把代码拷贝一份,然后分别在两份拷贝上实现不同的技术。这样,不但节省了存储空间,而且在我们需要评估二者的协同效果的时候,可以方便地将两个分支进行合并。试想一下,如果工程量巨大,那么我们需要在另个工程上重新实现一边会不会让人崩溃?
另外,方便地对错误修改进行回退。无论是工程上的软件开发还是科学研究工作,只要需要写代码,那么bug是不可能完全避免的,而且有些bug会非常严重,很难排查。这时候如果没有代码版本控制工具,也许我们之前的工作就全都白费了。如果我们使用了版本控制工具,相当于在我们确定的某个正确的节点上设置了回退点。如果发生了无法排除的错误,可以方便地回退到最近的一个提交点,重新开发最近几步的工作。
还有一点就是比较不同版本的差异,使用以下命令:
git diff