Git使用初步
1.什么是版本控制
版本控制(Revision control),也叫版本管理,是一种软件工程技巧,藉以在开发的过程中,确保由不同人所编辑的同一档案都能得到更新,大大方便了多人协作完成同一个工程。版本控制通过文档控制(documentation control)记录工程中每一个模块的改动,并为每次改动编上序号,以此可以方便的查询或者是恢复到以前版本。
2.为什么需要版本控制?
没有版本管理工具的协助,在开发中我们经常会遇到下面的问题:
a.无法跟踪文件改动。有人删除或者添加了一个文件时,你很难发现;这种情况也会发现在我们自己身上,有时候误删的事也会有。或者还会有不小心的覆盖等。
b.解决代码冲突困难。大家同时修改一个公共文件时,解决冲突也是个很头疼的问题。最原始方法是手动打开冲突文件,逐行比较,再手工粘帖复制。
c.参考a,b。
此外,还有一个很有诱惑里的用法,你可以一会儿在笔记本上改,一会儿在台式机上改,不用担心,操作的都是同一个文件。有点像云服务,不过不同计算机间同步在分布式的版本控制系统上实现更方便。
3.版本控制系统的发展历史
a.最原始的方法是为不同的版本新建一个文件夹。ok,亲身经历过不小心把整个文件夹shift+delete的悲剧。后来有种流行的东西叫rcs,通过记录文件的改动来达到版本控制的目的,俺没用过。
b.集中式版本控制系统。如著名的CVS,SVN等,抱歉,我也就知道这两个。故名思议,集中式版本管理系统就是有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连接到这个服务器,取出最新的文件,修改,上传。当然,如果服务器罢工了,大家可以坐下来喝喝茶聊聊天。
c.分布式管理系统。可以简单理解为人人都是服务器,其中代表就是我们即将要使用的Git。和SVN的最显著区别是,Git不只是从服务器取最新版本的文件快照,而是把原始的代码仓库完整复制过来。这样,可以用任意一个工作站中的镜像来还原服务器。同时,另一个好处是,两个工作站可以协同修改后再同步到服务器去。
4.常用名词解释
先介绍用git来管理本地的文件。
1)init----可以理解为新建一个Git管理项目。
2)add----添加新的文件(文件夹)到Git项目中,如果添加文件夹,该文件夹下所有文件将被包含。同时可以使用rm,mv从git项目中删除或是重命名文件(文件夹)。
3)commit----告诉Git你想要记录现在的操作,Git会保留一个当前修改过文件的快照。
4)reset----如果你正在编辑的文件乱了,可以选择从前面的commit点(假设是a点)重新开始编辑,通常是选择恢复到上一个编辑点。
5)check out----可以理解为在branch间切换。
4)branch----唔,所谓branch,可以理解理解为两个子版本,当前版本出现了两个不同分支。
5)merge----如果我正在编辑一个新版本a,有人在编辑新版本b,我们想把两个版本合成一个,就可以用merge。当然,合的过程中,有时候会检出有哪些地方不一样,询问到底要保留哪一个,需要手动处理不同的地方。事实上,这更像一个审查的过程。
6)diff----找出两个文档或目录的不同,有个qq游戏叫找茬。
7)revert----回卷到指定的commit。
然后开始和远处服务器的互动:
1)clone----从目标服务器得到整个用Git管理项目的拷贝。
2)pull----类似与SVN中的update动作,如果你N久前clone得到某项目的一份拷贝,用pull可以更新到最新版本。
3)push----故名思议,把当前的这份拷贝push到服务器。
其他:
1)working tree:刚check out过来,并未修改的文件。其实也就是你在对哪些文件进行操作。
2)index(staging area):有修改但是还没有commit的文件,新加进来的文件也在这里。
3)git directory(repository):修改并commit后,一个文件快照被推送到这里,被保存起来。
5.几个初学比较麻烦的名词
1)log和status:log是查看commit的历史;而status是查看是否有文件未commit,没有的话,当前的Git project是clean的。
2)reset和revert:首先,‘reset --hard’到某commit点后,用log查看,该点后所有commit都看不到了,文件被恢复到commit点时的样子;而revert到某commit点之后,用log查看,可以看到多了一个commit点,查看文件内容,被恢复到commit点。还有,必须是project clean时,才能执行revert。
3)branch和master。这两个之间的关系通常也比较让人头大,master通常都是神秘的。事实上,master也是一个branch,而且默认你是从master开始工作的。但是,怎样知道自己在哪个branch呢?有个神秘变量叫HEAD,它指向的branch就是你现在正在操作的branch,你可以用checkout让HEAD指向名为a,b,c。。。d的任意branch,或者是master。
6.工具不是万能的
再聪明工具也得正确使用,人才是操作主体。比如:
1)如果你做的事别人都不感兴趣,那你最好多找几个开放的服务器,把你的的git项目push上去,免得哪天自己电脑罢工了欲哭无泪。
2)你可以先pull下来服务器上的版本,和本地文件合并branch之后再push上去,这样貌似可以保持服务器上的文件最新。但是你push的时候,别人也可能在push。坐下来聊聊谁该听谁的吧,要不每人保持一个branch往下走?貌似不太现实,合作就没太大意义了吧。
3)不仅仅是管理代码,如果你愿意,放情书和xx照什么的到Git服务器上去也可以。用途请自由发挥。
7.免费Git服务器
• http://repo.or.cz/提供自由项目伺服服务,包括本文档(http://repo.or.cz/w/gitmatic.git)。
• http://gitorious.org 是另一个支持 Git 的开源项目伺服器。(貌似要关了)
• http://github.com 提供免费的开源项目伺服服务,包括本文档也在其中
国内的也挺好用:
git.oschina.net
8.基本操作
见另一篇《git使用记录》。
——————无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。