-
写这篇文章之前,笔者做过了一些测试。一直以来,笔者很想统一svn和git之间的代码,也很想统一来自不同的源之间的代码,使其一致,当然这里的一致是
指在存在与同一个目录,自由切换显示不同源、不同版本控制工具,不同的版本之间的代码比较。经过研究发现,这种比较能够减轻代码不同而引起的各种“困
惑”,让研发工程师更加“安心”。
- 读这篇文章之前,确保读者预先了解了git的各种用法,包括svn,了解git和svn的工作模式以及ssh密钥的一些知识。
目录
|
Git 分布式开发研究
序
-
写这篇文章之前,笔者做过了一些测试。一直以来,笔者很想统一svn和git之间的代码,也很想统一来自不同的源之间的代码,使其一致,当然这里的一致是
指在存在与同一个目录,自由切换显示不同源、不同版本控制工具,不同的版本之间的代码比较。经过研究发现,这种比较能够减轻代码不同而引起的各种“困
惑”,让研发工程师更加“安心”。
- 读这篇文章之前,确保读者预先了解了git的各种用法,包括svn,了解git和svn的工作模式以及ssh密钥的一些知识。
研究目的
- 很方便的比较复杂情况下的源代码异同;
- git相比其他配置管理工具的优缺点;
研究对象
- 配置管理工具git及svn
研究步骤
git基本用法
- 以Conf-Libconfig为例,从网络上拷贝一份工程副本:
> git clone git://github.com/cnangel/Conf-Libconfig.git
- 当然git使用clone的时候,相当于已经建立了git的档案信息,git和svn不一样,不是在每个目录下建立一个档案目录,git只在工程顶层目录下建立一个.git的目录。如不想使用clone方式进行工程的网络方式拷贝呢?可以像下面一样,首先建立一个目录:
> mkdir Conf-Libconfig
- 接着,建立git的档案信息:
> git init
- 此时,如果不需要分布式开发,虽然 Conf-Libconfig 还是一个空目录,但此时Conf-Libconfig已经有了一个完整的版本控制系统;然后加上远程的工程目标信息:
> git remote add libconfig git://github.com/cnangel/Conf-Libconfig.git
- 查看一下libconfig是否添加正确:
> git remote show
- 添加本地分支信息master,并映射到libconfig上:
> git config branch.master.remote libconfig
> git config branch.master.merge refs/heads/master
- 可以查看一下信息是否添加成功:
> git val -l
- 开始从网络拷贝工程副本,这里是pull操作
> git pull
- 添加文件README.20100930
> touch README.20100930
> git add README.20100930
- 提交,这里是本地提交
> git ci -m "add README.20100930"
- 若需提交到服务器上,则:
> git push
- 若查看日志信息,则:
> git log
commit 7416697c131d179652b3caab4c97236844365e24
Author: cnangel <cnangel@gmail.com>
Date: Fri Jun 18 08:27:05 2010 +0800
return result of config_setting_get_int_elem
commit 3da0885d6a531d2d7b458b4884a83365fd070215
Author: cnangel <cnangel@gmail.com>
Date: Thu Jun 10 14:58:21 2010 +0800
new version: 0.019
commit 1081814723af0d4a84c8611dcf66ac9b5ce8bb0f
Author: cnangel <cnangel@gmail.com>
Date: Thu Jun 10 14:41:23 2010 +0800
fixed by Diab Jerius
- 若比较两个两个日志的版本,则:
> git diff 1081814723af0d4a84c8611dcf66ac9b5ce8bb0f 7416697c131d179652b3caab4c97236844365e24
diff --git a/Libconfig.xs b/Libconfig.xs
index 00c3182..22a3ec6 100644
--- a/Libconfig.xs
+++ b/Libconfig.xs
-#if LIBCONFIG_VER_MINOR == 4
+#if (((LIBCONFIG_VER_MAJOR == 1) && (LIBCONFIG_VER_MINOR >= 4)) \
+ || (LIBCONFIG_VER_MAJOR > 1))
git svn用法
-
在公司,往往使用svn服务器,使用svn服务器也可以使用git,不仅仅避免产生多余的版本控制,减少磁盘空间,重要的是使用了分布式的思想,能够脱离
服务器,从而达到版本控制。对于svn服务器来说,git svn工具使用clone的手段,将svn服务器上的代码拷贝到本地,如:
> git svn clone -s http://libibase.googlecode.com/svn libibase
- 下载分支:
> git svn fetch
- 更新当前分支:
> git svn rebase
- 其他操作跟git一样,本地版本控制即可。
git多服务器工作方式
- 如果有多个服务器源,且服务器源有svn也有git方式,怎么将svn服务器与git服务器,甚至多个服务器上进行分布式管理呢?
- 方法很简单,多个git服务器,只需要:
> git remote add mypro http://foo.com/mypro.git
- 即可完成对多个git服务器源的添加,如果牵涉到svn服务器呢?首先,需要建立svn:
> git svn clone -s http://libibase.googlecode.com/svn libibase
- 然后,添加gitserver:
> git remote add mypro http://foo.com/mypro.git
- 注意建立git本地信息库的时候,需要:
> git config branch.myself.remote mypro
> git config branch.myself.merge refs/heads/myself
- 这样master分支仍然对应svn服务器,myself分支对应git服务器,当然笔者测试的结果svn服务器只允许添加一个,否则就会有冲突问题,这个问题是git svn工具的不足之处。
- 当我们对不同服务器之间的同样的工程进行比较的时候,就变得简单多了,因为都映射到本地分支了,所以只需要:
> git diff master myself
- 即可完成两个分支的比较,是不是很方便呢?
总结
- git是一种很好的版本控制工具,简单方便,学起来也非常容易。
- git工具相比于svn工具来说,它减少了对服务器和本地数据的交换,减少了带宽,减少了服务器的资源消耗,而对于本地资源来说,也减少了磁盘消耗,无论在飞机上还是火车上,都很方便的能够提交版本。
- git工具相比其他比如google的版本控制hg工具来说,有庞大的用户群,从linux kernel到google的chromiumos、chromium,到开源的perl以及QT,难道git工具还不值得推广使用么?