本教程试图解决的问题:
学习新东西一定要打牢基础, E哥建议看了这篇文章的同学要做到:
“呜呜呜,呜呜呜”,睡梦中的李靖被震动的手机铃声吵醒。
“妈蛋,今天周一,又要上班。我什么时候才能赚到足够的钱财务自由啊,想睡到几点就几点!” 半梦半醒的李靖心理默默念道。
“今天是到新单位的第二周,上周五领导说这周一开始要我布置编码任务了。”想到这里李靖一下睡意全无,一咕噜爬起来。洗漱完毕,套上一件白色T恤衫,把笔记本电脑塞进双肩包,背上匆匆出门。
李靖今年24岁,是一名有一年多工作经验的PHP攻城狮。 之前在北京的一家软件公司工作,上周刚跳槽到了一家互联网公司。新公司的工作节奏比之前的传统软件公司快多了,李靖感觉挑战蛮大的。不过一想到已经翻翻的工资,心理顿时充满了干劲。
上午9:30,公司的会议室里,雷神项目主管E哥和大家开完了例行的十分钟站立会,明确布置一天的工作任务后,单独把李靖留了下来,对李靖说:”测试组发现了网站上有几个bug,你刚来,这周就先修复这几个bug把,正好熟悉一下我们的系统。”
”好的, 没问题!“李靖心理还是有把握的,上周代码已经熟悉得差不多,应该问题不大。”不过有个事不是很有把握。“李靖为难道。
”啥问题? 说出来我们一起想办法解决。“E哥问道。
”我以前的单位用的svn提交代码, 咱们是用git,因为之前没有用过, 我想应该2,3天就能赶上,不过我担心这样会影响一些进度。“李靖心理知道,雷神项目最近正在进行新版开发,计划下周上线,时间比较紧。不过有风险,还是提前说出来比较好,免得到时候拖团队后台。
E哥想了一下,“那这样吧,我给做个简单的git培训,这样你能节省些时间。你拿上电脑到这个会议室,我们花2小时速度的过一下。”
李靖回工位拿上自己的笔记本电脑,等他返回会议室时,看见E哥拿墨水笔已经在墙壁的白板上画着一幅线框图。
”我们就开始吧!先来了解git一个非常重要的概念,” E哥快速切入主题,“ Git 管理项目时,文件在三个区域流转:Git 的工作目录(working directory),暂存区域(staging area),以及本地仓库(respository)。“
基本的 Git 工作流程如下所示:
E哥画完了图,总结道:“所以,在 Git 版本管理下的文件,都只有三种状态:已修改(modified),已暂存(staged)和已提交(committed)。“
”我的前一家公司用的版本管理软件是subversion,感觉它能做的事情和git差不多,不过在概念上和git略有不同。“李靖说道。
”不是略有不同,是有很大不同。 你用过svn,我就不从版本控制最基本的原理讲起了(不了解svn的同学自行百度补脑)。传统集中式版本控制系统,例如你刚提到的subversion, 在使用时,要先从中央服务器checkout最新的版本,然后开始修改代码,再把修改的文件提交给中央服务器。 这么做最显而易见的缺点是中央服务器的单点故障。例如当服务器的网络出现问题时,大家都没法工作。“
“是的,我们以前遇到过。公司的svn服务器坏了,我们好几天的代码没及时合并,后来解决冲突的代码花了好多时间。“李靖想起以前的经历直摇头。
“Git因为采用分布式版本管理,客户端并不只提取远程仓库的最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,服务器或者任何人的电脑坏了不要紧, 从其他人哪里克隆一个就可以了。客户端只有在需要时,才向远程仓库推送或者拉取代码。“
“我理解所谓分布式,相当于git在每台电脑上建立了版本管理服务器,绝大多数操作都只需要访问本地文件和资源。只在和远程仓库同步数据时才使用网络。“ 李靖补充到,” 这样的好处是即使没有网络,我也可以方便的在家里写程序而不用担心代码丢失了。 “
“是的,可以这样理解。“
“我们再来复习一下,“E哥指着白板上的状态图说,”git分布式版本管理文件的三个区域:
1. 工作区(working directory)
2. 暂存区(stage area)
3. 本地仓库( respository)
”我以前阅读技术文章时里面提到过一个叫github的网站,它做的开源社区现在非常火,你刚才说的远程仓库是指github吗?我们项目的代码也存在github上吗?“听完刚才对git特性的一番描述和推荐,李靖对git产生了浓厚的兴趣。
”GitHub是个开源代码的网站,它提供git服务可以用来托管各种开源代码。同时它提供一个web界面,方便项目的参与者浏览源码,Wiki编写,和各种git操作。 世界各地的程序员能在这里方便的对各种开源项目进行克隆,分支和提交修改。Github的出现,极大的方便了开源项目的管理,越来越多的开源项目纷纷从 SourceForge或Google Code这些老的网站迁移到github上, Github逐渐成为了开源软件开发以及发现已有代码的首选。”
“不过考虑到代码安全,公司的代码不会轻易放到互联网上。所以我们要搭建公司私有的git代码仓库。现在普遍使用gitlab这个开源项目, 它能搭建一个类似于github网站的web网站。公司用这种架构既能让大家享受到github方便的代码管理功能,又能保证公司代码的安全性“。
E哥说完拿起桌子上墨水笔,起身走到白板前面画了一个草图 :
“大部分公司的git环境是这样的。 要注意的一点是,由于公司搭建的gitlab是和互联网的github.com完全不同的环境,所以你在github.com注册的账号是不能在公司的gitlab上使用的,得注册一个新账号。“
“那git如何管理这些不同的账号呢?“李靖追问道, ”如果我在同一台电脑上既要用公司的环境也想在开源社区提交代码,账号之间会不会产生冲突呢?“
“你这个问题问得好,” E哥对李靖的好奇心很满意,点点头道:“ 等我们装上git,再来看怎么解决你提的这个问题。“
“实践出真知,我们边学边动手吧,先在你的笔记本上装一个git客户端。” E哥边说边打开了自己的笔记本电脑。
“你先访问Git 官方站点下载编译好的命令行客户端程序,网址我用QQ传给你。“
http://git-scm.com/download
李靖打开了电脑上的火狐浏览器,输入了E哥通过QQ发过来的链接地址,浏览器稍微等了两三秒缓慢地打开了网站。”好吧,这访问速度又被‘伟大的墙’给拖慢了!“李靖摇了摇头心里想。
“官方网站也提供图形化的客户端下载,”坐在李靖身旁的E哥补充到:”但是为了尽快掌握git,我建议你只使用git的命令行客户端。”
李靖按E哥指点,点击下载windows版本的链接:
http://git-scm.com/download/win
页面上显示 “下载已经开始”,看样子这个网站自动判断了要下载那个正确的版本,做的还是比较易用。不过浏览器一直显示在加载资源,没有开始下载的意思。
“点击手工下载吧,访问国外的网站比较慢,我们还是节约点时间!” 看来E哥已经对网络不抱希望了。
“下载时间还挺长的,我先去上个卫生间。记住安装时所有选项都选默认,一路点确认就行,这样能统一环境,避免不必要的麻烦。安装完成后在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功。”说完E哥起身离开了会议室。
下载进度在一点一点向前推进, 李靖趁这个空隙走出去到饮水机旁喝了点水,拿两个杯子,泡了两杯立顿红茶,放到会议室的桌上。
Mac的同学可以访问网址:
点击下载的dmg文件,根据提示进行安装。
使用linux的同学,首先输入git,确认一下系统有没有安装Git:
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
如果没有安装git,可以直接用系统提供的包管理工具来进行安装。
Debian/Ubuntu
$ apt-get install git
Fedora
$ yum install git
Gentoo
$ emerge --ask --verbose dev-vcs/git
Arch Linux
$ pacman -S git
openSUSE
$ zypper install git
FreeBSD
$ cd /usr/ports/devel/git
$ make install
Solaris 11 Express
$ pkg install developer/versioning/git
OpenBSD
$ pkg_add git
【小贴士】
如果你使用的是linux操作系统,你可以下载git的源代码,然后在自己的环境下编译和安装。编译前需要安装zlib,openssl等第三方库。对于初学者来说不是很推荐,有兴趣的可以阅读git的官方文档。
不一会E哥走回了会议室,看见了桌子上的热茶。 “咦!回来还有红茶喝,你小子够机灵的。“
”这叫拜师嘛!“李靖半开玩笑道。
”看来我得好好教,才对得起这杯茶啊!拜师礼我们就免了,改天请哥个吃顿金钱豹的400元自助餐吧!“
“没问题,E哥。”李靖笑道。
“在开始学习git命令前,需要一些准备工作。”E哥把笔记本电脑放到李靖旁边的位置,坐下来。
先确认命令行所在的目录位置, windows安装的git, bash命令行窗口的默认在/c/users/{username} 下。执行命令:
$ pwd
/c/Users/liyi
创建一个文件目录mygit,用来存放git仓库产生的文件:
$ mkdir mygit
$ cd mygit
$ pwd
/c/Users/liyi/mygit
如果之前没有github.com的账号,先在github.com上注册一个。 访问
https://github.com
填写你在github网站的用户名和电子邮件,根据提示进行注册。 当成功提交注册信息后,你的电子邮箱会收到一封github发送的确认邮件, 点击邮件中的“verify email address” 按钮确认邮件地址:
然后回到刚才的git命令行窗口输入:
$ git config --global user.name "Li Yi"
$ git config --global user.email "[email protected]"
其中的user.name 填写在github注册是的用户名, user.email 填写github注册时的邮箱地址。
注意git config命令的 –global 参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,我们后面在详细介绍有关 –global 的用法。
由于本地的git仓库和github通信时用到了ssh协议,处于安全认证需要,如果当前的电脑是第一次使用github,需要先生成ssh key,然后在github上将ssh key进行登记。
要创建创建SSH Key在命令行模式下,执行命令:
$ ssh-keygen -t rsa -C "[email protected]"
把邮件地址换成你注册github输入的邮件地址,然后一路回车,使用默认值即可。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥, id_rsa.pub是公钥。
$ cd .ssh
$ ls
id_rsa id_rsa.pub
$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDlqxIGoJUClIfKEXqIw2pC6tvug4qgKFNolPeXlt8lwOP0AQHoDCmkU0p+EonXptHJUh4Yywp81diLQM8nmCABGcz4irJfnXIZ+/qufHN2IeKL+Uj9UsmpPgmE4mKoTaTUijbIC14JXKwy68EjGztpU4tN/DeZ9gu1W+1ieOxumAvkx0b72LIX/CN+9A2PJePYDY8KH1Ws3kPJRMY2BcRatqhrqAn0of5F4N987B4HmhAMoKzHTUipMDFx9Z4vmjjSdbr77B3ToLO+bXcMnGZ5SUyr+HbiNzQhru8OxMRIP8M1jX4+wwc4gOQc/yGebtW7jFBAVdrPXnqzsM/fmzR hoopge@sina.cn
将id_rsa.pub的内容拷贝到内存中。
登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”, Title输入用户名,在Key文本框里粘贴id_rsa.pub文件的内容:
为了接下来的学习方便,从E哥的github里复制名叫egit的演示项目。 用你自己的账号登录到github,访问:
https://github.com/liyi-demo/egit
点击右上角的fork按钮, 从E哥的仓库中复制一份grit的代码到你自己的github仓库。
执行完后,在浏览器里, 你能看到你的github仓库已经有了一份egit拷贝, 而且右下角的url地址包含你的账号。
小贴士:
Git使用安全链接来保证git客户端和服务器端的通信安全。最常用到的两种通信协议是https和ssh。url以 https 为前缀,如:
*https://github.com/liyi-demo/egit.git*
这样的是https协议,它的好处是在互联网上使用广泛,传输使用443端口,一般公司的防火墙都不会拦截,在互联网上可用性很高。缺点是传输的效率不高,传输数据量大。url以git@为前缀,如:
*[email protected]:liyi-demo/egit.git*
这样的是ssh协议,它的优先是传输效率高。缺点是在互联网上使用没有前者广泛。所以github等互联网开源项目会推荐使用https,而公司内部的gitlab,一般推荐用ssh来提高效率。