一、版本控制系统简介

版本控制系统(VCS)是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。版本控制系统通常分为本地版本控制系统、集中式版本控制系统、分布式版本控制系统。

本地版本控制系统

许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单,但是特别容易犯错。有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。
为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。

其中最流行的一种叫做 RCS,现今许多计算机系统上都还看得到它的踪影。 甚至在流行的 Mac OS X 系统上安装了开发者工具包之后,也可以使用 rcs 命令。 它的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。

集中式版本控制系统

对于如何让不同系统上的开发者协同工作,本地版本控制系统显然力不从心。于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。 这类系统,诸如 CVS、Subversion 以及Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。

这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。 现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。事分两面,有好有坏。 这么做最显而易见的缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。 本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。

分布式版本控制系统

分布式版本控制系统(Distributed Version Control System,简称 DVCS)的面世解决了CVCS单点故障的缺陷。在这类系统中,像Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
在这里插入图片描述
更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。

二、git简介

Git是目前世界上最先进的分布式版本控制系统。

自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。

Git必看秘籍:https://git-scm.com/book/zh/v2

Git特点

速度
简单的设计
对非线性开发模式的强力支持(允许成千上万个并行开发的分支) 完全分布式
有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

Git状态

Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。
已修改表示修改了文件,但还没保存到数据库中。
已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
已提交表示数据已经安全地保存在本地数据库中。

这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。

三、git安装

git为rhel7自带,因此可以直接安装:

安装Git:

# yum install -y git

获取 Git 仓库通常有两种方式:

将尚未进行版本控制的本地目录转换为 Git 仓库。
从其它服务器克隆 一个已存在的 Git 仓库。比如: git clone

初始化版本库:

$ mkdir demo
$ git init
	Initialized empty Git repository in /home/git/demo/.git/ 
$ ls .git/
	branches  config  description  HEAD  hooks  info  objects  refs

.git目录是git跟踪管理版本库的,没事别瞎溜达!

添加用户信息才能上传

$ git config --global user.name "xzt"
$ git config --global user.email xzt@redhat.org

四、git使用

注意: git必须在仓库目录中执行

检查当前文件状态

$ git status
$ git status -s		//简化输出

状态简览

$ git status -s
 M README					#文件修改
MM Rakefile					#表示对暂存区的文件做了修改
A  lib/git.rb				#以添加的文件,处于暂存区
M  lib/simplegit.rb			#对MM状态的文件进行了添加操作后的状态
?? LICENSE.txt				#未添加的新文件

添加新文件到暂存区

$ git add testfile

添加后文件就处于暂存区了,查看文件的状态未A

如在目录中有一些文件我们不希望其放在仓库中,就可以编辑忽略文件:

$ cat .gitignore
.*		//忽略所有隐藏文件
/test		//只忽略当前目录下的test文件
build/		//忽略任何目录下名为 build 的文件夹

文件的内容就是想要忽略的文件或目录名。

查看已暂存和未暂存的修改了哪些内容

$ git diff

提交更新

$ git commit -m

-m选项表示文件的描述。

跳过使用暂存区域直接上传

$ git commit -a -m 'added new benchmarks'

正常将文件保存到仓库的步骤就是先创建文件,再add,最后commit。

移除文件

$ git rm PROJECTS.md
$ git rm --cached README

重命名文件

git mv README.md README

其实,运行 git mv 就相当于运行了下面三条命令:

$ mv README.md README
$ git rm README.md
$ git add README

查看提交历史

$ git log
$ git log -p -2		#查看前两个
$ git log --stat
$ git log --pretty=oneline		#显示为id和文件名

取消暂存的文件到工作区

$ git reset HEAD README.md

撤消对文件的修改,也可以在使用rm -rf 或git rm删除文件后撤销删除。

$ git checkout -- README.md  撤销修改
$ git checkout  HEAD README。md   恢复删除

版本回退:

$ git reflog			#查看历史版本
$ git reset --hard efa267a			#其中最后为版本id

五、git结合github

远程仓库:注册github帐号,并新建一个仓库:
在这里插入图片描述两种方式饥可以推送本地仓库内容到github:https和ssh
在这里插入图片描述采用ssh方式:
server1

# ssh-keygen		#生成本地密钥
# cd
# cd .ssh/
# cat id_rsa.pub			#复制公钥

server1利用私钥免密连接github的公钥

在这里插入图片描述在这里插入图片描述添加远程仓库:

# git remote add origin git@github.com:xzt/demo.git

添加后可以使用git remote -v查看远程仓库的列表。

添加后进行推送:

cd demo
echo haha >testfile
 git push origin master

推送后就可以在github看到仓库中的内容了

此时如果在本地把仓库目录删除了,可以通过以下命令克隆github里的内容:

# rm -rf demo/
# git clone git@github.com:xzt/demo.git
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐