说到Git,必须要先谈一下版本控制。什么是版本控制?我为什么要关心它呢?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制的类型大致可以分为三大类:
本地版本控制系统
其中最流行的一种叫做 rcs,它的工作原理基本上就是保存并管理文件补丁(patch)。文件补丁是一种特定格式的文本文件,记录着对应文件修订前后的内容变化。所以,根据每次修订后的补丁,rcs可以通过不断打补丁,计算出各个版本的文件内容。
集中化版本控制系统
为了让在不同系统上的开发者协同工作,集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS)应运而生。这类系统,诸如CVS,Subversion以及 Perforce等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。然而,事分两面,有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端偶然提取出来的保存在本地的某些快照数据就成了恢复数据的希望。但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
分布式版本控制系统
分布式版本控制系统( Distributed Version Control System,简称 DVCS),在这类系统中,像 Git,Mercurial,Bazaar以及 Darcs等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
版本控制的类别说完了,那么为什么要如此重视git呢?基于其分布式版本控制的优点和工作(创建和切换分支等)的高效性,git已经越来越流行,在国内的IT开发中也会慢慢取代SVN的。当然取代只是博主个人观点,so,上干活。
git 的命令行的使用
1、git的初始化首先在桌面上创建gitTest文件夹,然后创建ios项目并保存到gitTest文件夹下。当然,这里讲的是git的初始化,所以在创建工程的时候不要勾选创建git仓库选项,如下图:
由于mac系统是自带git的,所以git的命令在mac是直接可以使用的。
首先打开终端看一下本机的git版本:$ git version
对于一个没有进行版本控制的工程进行初始化(这里是对gitTest文件进行初始化)
(1)进入目录
(2)初始化仓库 $ git init
(3)添加文件到仓库的暂存区中 $ git add .(添加所有文件到暂存区)
(4) 提交 文件到仓库 $ git commit -m '注释' (-m 加注释的命令)
注意:3和4可以合成一个命令来完成 $git commit -a -m '注释'
接下来看终端的操作:
仓库初始化完之后,在文件夹下会生成一个.git的文件夹,里面存放的是git的配置文件和工程的快照。以点开头的文件在mac下是隐藏文件,可以用下面的命名显示mac的隐藏文件:$ defaults write com.apple.finder AppleShowAllFiles -bool true //显示文件夹 ,隐藏文件夹只要把true改为false
$ killall Finder //彻底关掉Finder
注意:os 10.10之前不用使用killall Finder,只要关掉Finder再重新打开就能看到效果,os 10.11需要killall Finder才能看到效果
截图如下:
至此已经把项目加入到了本地的仓库中,即git初始化完成。在对文件进行修改的过程中还会使用到一下git 命令:
$ git status //查看文件的状态
$ git diff //查看未加入暂存区的修改的文件内容
$ git diff --cached //查看已经加入暂存区的修改的文件内容
$ git log //查看提交的记录
$ git reset //撤销修改
2、git status实例如下图:
说明:凡是有改动但没有加入到暂存区的文件都显示在Changes not staged for commit:下;凡是加入到暂存区没有提交的文件都在Changes to be commit:下。
注意:提交的时候,git只会把暂存区中的文件提交到仓库中;所以提交的时候一定要看清楚文件的状态;
3、git diff 实例如下:
说明:由下图可以看出在文件中增加了look diff,然后用git diff 命令可以看出未加入暂存区的文件的修改;用git diff --cached查看加入暂存区的文件修改;当采用 git add . 把所有文件都加入到暂存区后使用 git diff是查看不到任何修改的。
4、git log实例如下:
说明:git log 会根据提交时间列出所有提交的记录;git log -2 会列出最近两次的提交记录;git log -p -2 会详细的列出最近2次修改的记录;下面的图为提交了两次后进行的操作
5、git reset (回退/撤销)
说明:
回退到之前的某个版本:(本地源码会改变)
git reset --hard HEAD^ //回退到上个版本
git reset --hard HEAD^^ //回退到上上个版本
git reset --hard HEAD~100 //回退到前100个版本
git reflog //查看版本信息
git reset --hard 版本号 //回退到指定版本
撤销本次commit (本地源码不会改变)
git reset --soft HEAD^
撤销add (本地源码不会改变)
git reset 或者git reset --mixed
回退工作区的修改 (本地源码会改变)
git checkout -- filename 撤销工作区的修改(即没有add之前修改)
回退到没有任何修改之前和服务器一样
git reset --hard origin/master //将本地版本回退到和远程服务器一样
6、git 分支
几乎每一种版本控制系统都以某种形式支持分支,而git的分支可以说是git的必杀技(速度快,操作简单)。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
命令如下:
<1>、创建新的分支 $ git branch 分支名
<2>、切换分支 $ git checkout 分支名
注意1和2可以合成一个命令来完成: $ git checkout -b 分支名
<3>、合并分支 (即把其他分支和当前分支合并在一起)
(1)切换到要合并到的分支 $ git checkout 分支名
(2) 进行合并 $ git merge 分支名
<4>、删除分支 $ git branch -d 分支名
<5>、查看所有分支 $ git branch
7、git添加标签
<1>创建标签 $ git tag -a 标签名 -m ‘注释’
<2> 切换标签 $ git checkout 标签名
<3> 删除标签 $ git tag -d 标签名
<4> 查看所有标签 $ git tag
8、远程仓库操作
至此,git本地的版本控制用到的命令基本上都有了。接下来来看一下git本地仓库和远程仓库的结合使用。这里使用https://bitbucket.org仓库托管网站。登录此网站后先注册用户,注册完用户后就可以获得免费的私人仓库,此仓库可以允许最多5个人一起共享开发。具体使用方法,这里就不多说了。开始上干货。
在bitbucket网站创建仓库gitTest,创建完成后如下图:
点击仓库进入后,会有提示如下图:
现在本地已经有了一个仓库,接下来采用上图中的第二种方法把本地仓库推送到bitbucket上
执行完以下git命令之后如上图,推送本地仓库到远程仓库成功
<1>、$ git remote add origin 远程仓库路径
<2>、$ git push -u origin --all 提交所有的文件
从现在开始,如果改变了本地代码并且要提交到远程服务器上就要进行以下三步:
<1> commit 提交本地代码
<2>$ git pull 拉取服务器上的最新代码
<3>$ git push 提交到远程服务器
接下来来看一下,本地没有仓库,需要从远程仓库上clone一份的情况
克隆的命令如下:
<1> git clone 远程仓库地址 --------------------直接克隆仓库到本地,并且本地文件夹的名字和远程仓库的名字一样
<2> git clone 远程仓库地址 本地文件夹名字 --------------------直接克隆仓库到本地,并且本地文件夹的名字和远程仓库的名字不一样
从已有仓库中获取干净的代码
//获取干净的代码
git archive --format zip --output /Users/Nick/Desktop/git/output.zip master -0
Xcode git版本控制
Xcode 中的操作如下图所示:
sourceTree 进行代码的控制
sourceTree是git仓库的客户端,可以在appSotre中或去官方网站下载。
1、添加新的仓库
添加成功后如下图所示:
2、打开后并进行修改代码后的图如下:
关于bitbucket和sourceTree的具体用法,请自行搜索学习。
注明:转载自 Nick的专栏 http://blog.csdn.net/xiaonaiping061/article/details/49685675