一、关于版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。目前存在以下三种版本控制系统:
1、本地版本控制系统
通过复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单。不过坏处也不少:有时候会混淆所在的工作目录,一旦弄错文件丢了数据就没法撤销恢复
2、集中式版本控制系统
接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )应运而生。这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
这样做法带来了许多好处,相对于老式的本地版本工具来说,每个人可以看到项目中其他人在做什么,管理员也可以轻松的分配权限,也有许多弊端,集中式版本控制系统,每个人的操作会直接与中央仓库进行交互,如中央仓库宕机,任何人将无法操作,也会受限于网络波动等原因。
3、分布式版本控制系统
在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
二、Git工作方式
Git属于分布式管理系统,安装git客户端后,每个人的本地都相当于一个git仓库,Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接.
1、提交仓库的五个状态,四个区域
5种状态:未修改origin/unmodified、已修改modified、已暂存staged、已提交committed、已推送:pushed
特点:1、几乎所有操作都在本地进行 2、 时刻数据完整性(在提交到git之前,所有内容都要进行校验形成一个40个十六进制的字符,所有保存在git数据库中的东西都通过此哈希值索引)
2、git提交方式
这就有git独特的提交方式:git add → git commit -m →git push
git add :跟踪新文件,后面可以指明要更新的文件和目录路径,也可以加上 . (点)代表加入所有未纳入版本库的文件。译文:官方的解释git add 的潜台词就是把目标文件快照放入暂存区域,也就是 add file into staged area,同时未曾跟踪过的文件标记为需要跟踪
git commit:提交到本地仓库。-m代表添加注释,-a代表git add和git commit合并
git push origin master:推送到名为origin的远程仓库的master分支
3、git获取代码方式
git clone url:克隆代码
git pull:拉取远端代码并与本地代码合并(#在你要提交代码到远端服务器之前,一定要做pull,保证你与远端版本一致,此过程有可能会有冲突,先解决冲突,再提交)
git fetch:拉取远端仓库到本地仓库
git merge:合并操作
所以说,git merge + git fetch = git pull
4、常见的命令
#上面两图中的命令不在做分析
git status:查看文件状态
git diff: 查看已暂存和未暂存的更新,也就是修改之后还没有暂存起来的变化内容。
git diff --cached : 查看暂存起来的文件和上次提交时的快照之间的差异,Git1.6.1版本以后可以用git diff --staged
git rm:删除已经提交的文件,-f:如果之前已经修改过并且放入暂存区,需加-f
git mv:移动文件,git并不跟踪文件移动操作,相当于以下两条命令:git rm xx.txt git add xx.txt
git log: 查看提交历史,默认只显示commitID、作者、提交日期,-p代表每次提交的内容差异,-2代表最近两次日志,--stat代表显示行数,--pretty=oneline代表简化日志信息,一行显示,也可以定制日志格式,例如:Git log git log --pretty=format:"%h - %an, %ar : %s":各选项含义见下方附录
git checkout:取消对文件的修改(没有提交到暂存区,也就是没有git add过),也可以用作切换分支(前提要保证当前工作区的整洁)
git tag:创建标签,标签时用来记录开发过程中的一些关键时刻,-m:添加标签注释
5、小技巧
1、git命令别名:
例如:git config --global alias.co checkout ,此时git checkout = git co
git config --global alias.last 'log -1 HEAD', 此时git last = git log -a HEAD
附录:
选项 | 说明 | ||
%H | 提交对象(commit)的完整哈希字串 | ||
%h | 提交对象的简短哈希字串 | ||
%T | 树对象(tree)的完整哈希字串 | ||
%t | 树对象的简短哈希字串 | ||
%P | 父对象(parent)的完整哈希字串 | ||
%p | 父对象的简短哈希字串 | ||
%an | 作者(author)的名字 | ||
%ae | 作者的电子邮件地址 | ||
%ad | 作者修订日期(可以用-date=选项定制格式) | ||
%ar | 作者修订日期,按多久以前的方式显示 | ||
%cn | 提交者(committer)的名字 | ||
%ce | 提交者的电子邮件地址 | ||
%cd | 提交日期 | ||
%cr | 提交日期,按多久以前的方式显示 | ||
%s | 提交说明 |