Yuguo.us

git基础

Introduction

user

余果

全栈工程师,《Web全栈工程师的自我修养》作者。


Featured

back-end

git基础

Posted by 余果 on .

git是一个分布式的版本控制系统(VCS)。

为什么要使用git?

版本控制系统是用来管理文件的每个版本变化的一个系统,它对设计师、作家、程序员都是很好用的工具。我经常看到设计师用拷贝文件的方式实现版本控制,比如“首页20120721.psd”等,一个文件夹里有很多这样的拷贝,缺点很明显:如果搞错了文件,就会保存到错误的版本中,还有文件丢失就找不回来了。

采用版本控制系统是个明智的选择。有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。你可以比较文件的变化细节,查出是谁最后修改了什么地方从而造成某些怪异问题,又是谁在何时报告了某个功能缺陷,等等。使用版本控制系统通常还意味着,就算你胡来搞砸了整个项目,把文件改的改,删的删,你也可以轻松恢复到原先的样子。而由此额外增加的工作量却微乎其微。

那么有些什么样的版本控制系统呢?主要分为三种:本地版本控制系统、集中化的版本控制系统、分布式版本控制系统。 本地版本控制:刚才说的设计师在本地文件夹复制很多文件的方式就是一种简单的本地版本控制,但是由于这种做法的显著缺点,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。本地版本控制数据只存在本机,适合于不需要跟其他人合作的项目。 集中化的版本控制系统:SVN是最常用的一种集中化的版本控制系统,在程序员中尤为常见。它的文件历次变更记录都保存在一个中央服务器,一方面解决了历史代码的管理问题,另一方面解决了多人合作同一个项目的问题。在多人项目中,如果我修改了代码,其他人也在他的计算机上修改了代码,我们各自提交到集中化版本控制系统的时候,系统会自动把我们的修改合并到同一个文件集。缺点是中央服务器如果当机那么整个项目都无法运作了,而且分支操作、切换操作、提交操作等都与网速有关。 分布式版本控制系统:分布式版本控制系统比起集中化的版本控制系统有更多的优点,因为文件变更的历史记录不再存在一个集中服务器(虽然也可以设计成使用一个主服务器),而是所有的客户端都会把原始的代码仓库完整地镜像下来,这么一来,如果服务器故障,事后都可以用任何一个镜像出来的本地仓库恢复。

所以如果你没有网络,完全没有关系,近乎所有的操作都可本地执行,速度非常快。用CVCS 的话,没有网络或者断开VPN 你就无法做任何事情。但用Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程的镜像仓库。同样,在回家的路上,不用连接VPN 你也可以继续工作。

安装git

在windows上按照git的话我推荐装一个git bash,是命令行模式的客户端,下载地址:http://msysgit.github.com/

初始化一个目录

有两种办法初始化一个目录,也就是把该目录下的文件纳入git控制。

方法一是克隆一个远程仓库,在git bash中先使用cd命令切换到该目录希望所在的目录,然后:

$ git clone git://github.com/schacon/grit.git

熟悉SVN的同学在这里要特别注意git和svn的巨大区别!如果你使用svn在一个文件夹下使用checkout操作之后,就会把checkout的目标——一个远程仓库中的某个分支或者某个版本——checkout到本地。

但是git这里的命令不是checkout,而是clone,这是个非常重要的差别,Git 收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。实际上,即便服务器的磁盘发生故障,用任何一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆时的状态。

方法二是对本地目录进行版本控制,首先cd到该目录,然后:

$ git init

$ git add *.c

$ git add README

$ git commit -m 'initial project version'

文件状态

请记住,工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪已跟踪的文件是指被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。

可以使用命令:

$ git status

查看当前工作目录下的所有文件的状态,我最喜欢和常用的就是这个命令了。

常用命令

我最常用的代码有以下几个:

查看当前工作目录所有文件的状态——

$ git status

增加某个文件到暂存区——

$ git add readme.md

把所有文件放到暂存区(除了.gitignore中声明的文件)

$ git commit -m 'some comments'

把暂存区的代码提交到快照

$ git push origin master

把本地的master分支的快照提交到远程的origin代码库

git托管服务

如果不想经历自己架设 Git 服务器的麻烦,网络上有几个专业的仓库托管服务可供选择。这样做有几大优点:托管账户的建立通常比较省时,方便项目的启动,而且不涉及服务其的维护和监控。即使内部创建并运行了自己的服务器,为开源的代码使用一个公共托管站点还是有好处——让开源社区更方便的找到该项目并给予帮助。 GitHub 是到目前为止最大的开源 Git 托管服务,前段时间才获得1亿美元的投资,现在很多开明的公司招聘程序员都会看你在github上的repo(代码仓库)。

将已有的代码部署到github上或者从头创建一个项目之后,该项目就是托管在github上了,你将在项目页面的头部发现两个url:

Public Clone URL(公共克隆 URL)是一个公开的,只读的 Git URL,任何人都可以通过它克隆该项目。可以随意的散播这个 URL,发步到个人网站之类的地方。

Your Clone URL(私用克隆 URL)是一个给予 SSH 的读写 URL,只有使用与上传的 SSH公钥对应的密钥来连接时,才能通过它进行读写操作。其他用户访问项目页面的时候看不到该URL——只有公共的那个。

如果你有私人项目不希望开源,那么可以使用bitbucket,除了可以自建无限个私有代码仓库以外,跟github的使用方法基本一致。

派生(fork)项目

如果想向一个自己没有推送权限的项目贡献代码,GitHub 提倡使用派生(forking)。在你发现一个感兴趣的项目,打算在上面 Hack 一把的时候,可以点击页面上方的 “fork(派生)” 按钮,GitHub 会为你的用户复制一份该项目,这样你就可以向它推送内容了。

 

user

余果

https://yuguo.us

全栈工程师,《Web全栈工程师的自我修养》作者。