git的基本介绍和使用

前言:从事iOS开发一年多以来,一直使用svn管理源代码。对svn的特色和弊端已经深有体会。前些天双十二先后,项目工期紧张到爆,起早贪黑的加班,可谓披星戴月,这还不止,回到家中还要疯狂的敲代码。那么问题来了,公司svn服务器是内网服务器,在家里没法访问,提交/更新代码就成了问题。跟技术总监(笔者公司为初创型小公司,直接和技术总监对话)沟通后,技术总监赞成了把svn服务器改成外网服务器。可是,这并非好的解决办法,毕竟svn服务器挂到外网上,从安全性上老是说不过去。因而乎,git成了我心中取代svn的上上策。昨天上班开会就跟CTO提出使用git管理代码的建议,他也愉快的答应了。html

可是,多数人对git并无像对svn这般了解,因此,针对于git和svn的特色和区别,我但愿可以经过这篇文章拨开你们心中的疑惑。git

简介

git是一款开源的分布式版本管理工具,git的诞生也是至关传奇的,由Linux之父-Linus Benedict Torvalds开发而来,当初Linus Benedict Torvalds仅仅是为了辅助Linux内核的开发才一并开发了这个至今为止世界上最快的、最简单的版本管理工具。关于这个传奇的故事,笔者就不在此赘述。github

目前,git虽然很流行,但也仅仅是在国外。在国内,多数公司还在使用svn进行版本控制,不过不用担忧,据笔者所知,已经有不少大公司(像BAT这样的互联网公司)开始由svn转向git。而且,愈来愈多的开源项目已经转移到git,不少开源网站上的代码就是git来管理的,因此git取代svn是大势所趋的。算法

git的特色

前面已经说过,git是一款开源的分布式版本管理工具。相对于分布式,还有一种集中式,集中式版本管理工具的杰出表明就是svn。关于svn的详细介绍,读者能够查看笔者以前写过的几篇文章:http://www.cnblogs.com/wsnb/p/4765597.html   http://www.cnblogs.com/wsnb/p/4771379.html安全

以下两张图,能够归纳分布式和集中式管理工具的架构,图(1)为分布式版本管理工具架构,图(2)为集中式管理工具架构。服务器

     

                              图(1)       markdown

 

               图(2)网络

这里笔者想象出来一个比较容易理解的例子,能够归纳出分布式和集中式的区别:像BAT这样的大公司,员工层级架构比较复杂,每一个技术部门都设有技术负责人(CTO),而每一个部门内部又根据分工设有技术经理、主管、组长等等,通常状况下,员工只须要向本身的直属上级汇报工做便可,这样工做起来,效率比较高。而像笔者这样的初创型小公司,部门内部角色就没有那么复杂了,技术部门每一个员工均可以向CTO直接反应问题,CTO要处理来自N个技术人员反应的问题,效率比较低。BAT这样的大公司的员工各层级架构就像是分布式同样,然后者就像是集中式同样。架构

从图(2)能够看出,集中式管理系统的代码统一的由一台服务器集中管理。其余系统若是想获得代码,必须从这一台服务器上拷贝。一样,其余系统想要提交代码,也只能向这台服务器提交。这台服务器起到了一个集中管理全部代码的做用,固然若是svn服务器出现故障,那么后果不开设想。分布式

从图(1)能够看出,分布式管理系统的代码能够由本身本地服务器来管理。由于每一个系统本地都有一个本地代码仓库(至关于远程代码仓库在本地的备份),本地系统能够先把代码提交到本地代码仓库,而后再由本地代码仓库提交到共享版本库(在这里,共享版本库至关于集中式管理系统的远程代码仓库)这样在本地系统和共享版本库之间添加了一层本地代码仓库,开发人员直接和本地代码仓库打交道,减轻了对共享版本库的压力,而且也下降了开发人员由于误操做而致使对远程代码仓库的污染。

正是由于两者的这个差异,经过分布式,咱们能够在没有网络的状况下,先把代码提交到本地代码仓库,速度之快不言而喻,待到有网络时再提交到共享版本库。而若是经过集中式,咱们不可以在没有网络的状况下把代码提交到远程代码仓库,即使是有网络,频繁的传输对svn的压力比较大,而且每次传输都要受限于网络速度。

git工做原理

git的工做原理仍是比较简单的,当咱们建立了本地代码仓库后,会在本地代码仓库的根目录中生成一个.git的隐藏文件。.git为一个文件目录,又叫作版本库。在本地代码仓库文件夹中,除.git目录以外的全部与.git同级的目录及其子目录都叫作工做区。

工做区(Working Directory):仓库文件夹里除.git目录之外的内容

版本库(Repository):.git目录,用于存储记录版本信息
    暂缓区(stage)
    分支(master):git自动建立的第一个分支
         HEAD指针:用于指向当前分支
git add和git commit的原理
git add :把文件修改或者新添加的文件添加到暂存区
git commit :把暂存区的全部内容提交到当前分支

下面一幅神图就能够解释git add 和 git commit的原理:

咱们修改或者新添加的文件起初是处于工做区,经过git add命令能够把工做区的文件移动到版本库中的暂缓区(stage)。

处在暂缓区(stage)的代码能够经过git commit -m “提交的注释” 提交到版本库中的分支(master)。

处在分支(master)中的代码能够经过git push命令push到共享版本库。

注意:只有分支中的文件才能够push到共享版本库。

git经常使用命令

1.初始化一个代码仓库
git init
2.若是使用git必须给git配置一个用户名和邮箱
给当前的git仓库配置一个用户名和邮箱
git config user.name “ws”
git config user.email “ws@163.com”
配置一个全局的用户名和邮箱
git config --global user.name “ws”
git config --global user.email “ws@163.com”
3.初始化项目
touch main.m : 建立了main.m
git add main.m : 将新添加的文件或者修改的文件添加到暂存区
git commit -m “初始化项目”
git add . : 将全部没有被添加到暂存区或者代码仓库的文件添加到暂存区
注意:不管是新添加的文件或者修改的文件,都须要先经过add命令添加到暂存区中,以后再经过commit命令添加到本地仓库中
4.查看文件的状态 git status
红色 : 新建立的文件或者被修改的文件,没有被添加到暂存区
绿色 : 表示文件在暂存区,可是没有被添加到本地仓库中
5.给命令起别名
git config alias.st “status”
git config alias.ci “commit -m”
git config --global alias.st “status”
6.git删除文件
git rm 文件名
7.查看版本号
git log
git reflog
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit”
git lg
8.git的版本号是由sha1算法生成40位的哈希值
9.版本回退
git reset --hard HEAD : 回退到当前的版本
git reset --hard HEAD^ :  回退到上一个版本
git reset --hard HEAD^^ : 回退到上上个版本
git reset --hard HEAD~100 : 回退到前100版本
git reset --hard 版本号(前5位)

 

  1. 用户名和邮箱地址的做用

    用户名和邮箱地址是本地git客户端的一个变量,不随git库而改变。

    每次commit都会用用户名和邮箱纪录。

    github的contributions统计就是按邮箱来统计的。

  2. 查看用户名和邮箱地址:

    $ git config user.name
    
    $ git config user.email
  3. 修改用户名和邮箱地址:

    $ git config --global user.name "username"
    
    $ git config --global user.email "email"
  4. 每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,因此会随更新内容一块儿被永久归入历史记录.
  5. 用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,之后你全部的项目都会默认使用这里配置的用户信息。

初始化共享版本库

真实的git服务器的搭建是很是繁琐且复杂的,而且git服务器只能搭建在Linux系统上。笔者对git服务器的搭建不作介绍,往后有时间再加以补充。在此仅对共享版本库的搭建进行详细介绍。

文件夹做为共享版本库

1.建立共享版本库文件夹,而后终端进入该文件夹下执行如下命令建立一个空的共享版本库
git init --bare
2.项目经理将共享版本库的内容先下载下来,命令后面的地址即为共享版本库所在服务器的地址+路径
git clone 地址
3.添加须要忽略的文件 touch .gitignore 去github上搜索.gitignore->Objective-C,把Objective-C中的内容粘贴到建立的.gitignore文件中(或者直接把github中的Objective-C文件下载到该目录下)。而后执行如下命令 git add .gitignore git commit -m “添加了须要忽略的文件” 4.项目经理初始化项目 git commit -m “初始化项目”—>提交到本地代码仓库 5.将项目push远程仓库中 git push origin 6.当源代码管理是使用git,而且在Xcode进行多人开发的操做 注意:当使用git,项目中用到了静态库就不须要经过命令行进行添加

 git版本备份

1.1.0版本开发完成,以后对1.0版本进行备份
git tag -a weibo1.0 -m “这个是1.0版本” : 给某一个版本打上标签(weibo1.0是标签名称)
git tag : 查看全部的标签
2.须要将1.0版本的标签,push到服务器
git push origin weibo1.0
3.继续开发2.0版本
4.发现1.0版本有bug,从标签里面clone 1.0版本,从标签建立一个fixbug分支,在分支中修复bug
git clone 共享版本库
git checkout weibo1.0(标签的名称)
git checkout -b weibo1.1fixbug(分支名称)
5.修复后的版本上传AppStore/将1.0fixbug进行备份/将1.0fixbug版本和2.0版本进行合并\
git tag -a weibo1.1 -m “这个是修复了1.0版本bug的1.1版本”
git tag
git push origin weibo1.1
将子分支中代码合并到主分支,pull—>weibo1.1fixbug—>push master—>其它同事更新
6.删除分支
git branch -r(r是远程仓库的意思,这个命令能够查看远程仓库中的分支)
git branch -r -d 分支名称

 以上主要介绍了git的原理和如何用命令建立一个代码仓库,关于如何使用第三方git服务器托管代码,请见下一篇文章。

相关文章
相关标签/搜索