SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

分布式集中式

CVS及SVN都是集中式的版本控制系统 , 而Git是分布式版本控制系统

 

集中式版本控制系统,版本库是集中存放在中央服务器的,

而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,

干完活了,再把自己的活推送给中央服务器。

中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

 

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,

这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?

比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,

这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

 

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,

因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。

因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,

但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

 

自报家门:设置你的名字和Email地址

安装Git后(windows)

在开始菜单里找到“Git”->“Git Bash”

  $ git config --global user.name "Your Name"

  $ git config --global user.email "email@example.com"

查看自己的用户名和邮箱地址:

  $ git config user.name

  $ git config user.email

Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第1张

 

 

创建版本库

 通过   git init  命令把这个目录变成Git可以管理的仓库:

Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第2张

 

缓存文件 提交文件

 在该目录下编写一个readme.txt文件,内容如下:

Git is a version control system. Git is free software.

 第一步,用命令      git add  告诉Git,把文件添加到仓库:

  $ git add readme.txt

   或者使用以下命令一次性add所有修改

    $ git add .

 

 第二步,用命令   git commit  告诉Git,把文件提交到仓库:

  $ git commit -m" wrote a readme file""

   Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第3张

   简单解释一下git commit命令,   -m 后面输入的是本次提交的说明,可以输入任意内容,

  当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

 

 

时光机穿梭  版本回退

 

修改readme.txt文件

 我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,

于是,我们继续修改readme.txt文件,改成如下内容:

  Git is a distributed version control system.
  Git is free software.

 

git status 查看当前版本库状态

现在,运行   git status  命令看看结果:

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第4张

git status  命令可以让我们时刻掌握仓库当前的状态,

上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

 

 git diff  看看具体修改了什么内容

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。

比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt

所以,需要用git diff这个命令看看:

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第5张

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式

 

知道了修改后 没问题可以缓存修改了 git add .

知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,

提交修改和提交新文件是一样的两步,第一步是git add .

然后git status 查看版本库当前状态

Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第6张

 

进行提交 $ git commit -m""

$ git commit -m "add distributed"
提交后,我们再用git status命令看看仓库的当前状态:

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第7张

Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。

 

现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下:

 

Git is a distributed version control system. Git is free software distributed under the GPL.

 然后缓存改动  并 提交

Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第8张

 

像这样,你不断对文件进行修改,然后不断提交修改到版本库里,

 

就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,

如果某一关没过去,你还可以选择读取前一关的状态。

有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。

 

Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit

一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

 

现在,我们回顾一下readme.txt文件一共有几个版本被提交到Git仓库里了:

 

版本1:wrote a readme file

Git is a version control system. Git is free software.

 

版本2:add distributed

Git is a distributed version control system. Git is free software.

 

版本3:append GPL

Git is a distributed version control system. Git is free software distributed under the GPL.

 在Git中,我们用  git log 命令查看历史记录

 版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第9张

 

 git log命令显示从最近到最远的提交日志,

我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file

 

需要友情提示的是,你看到的一大串类似7fb0f...的是commit id(版本号)

和SVN不一样,Git的commit id不是1,2,3……递增的数字,

而是一个SHA1计算出来的一个非常大的数字,用十六进制表示

 

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。

如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:

 

现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是add distributed的那个版本

 Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第10张

上一个版本就是HEAD^上上一个版本就是HEAD^^

当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

 

 

 现在,我们要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset命令

 

  $ git reset --hard HEAD^

     hard很危险

            git reset soft,hard,mixed之区别深解

   Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第11张

 

  使用git log 查看一下版本库

  Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第12张

 

回退到上一个版本add distributed了,但是又想改回版本append GPL去怎么办

 

 好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?

 

 笨方法: 只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,

    找到那个append GPLcommit id,于是就可以指定回到未来的某个版本:

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第13张

版本号没必要写全,前几位就可以了,Git会自动去找。

 

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,

当你回退版本的时候,Git仅仅是把HEAD从指向append GPL

     Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第14张

git reflog

 现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?

 

当你用$ git reset --hard HEAD^回退到add distributed版本时,

再想恢复到append GPL,就必须找到append GPL的commit id。

 

Git提供了一个命令 git reflog 用来记录你的每一次命令:

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第15张

终于舒了口气,从输出可知append GPL的commit id,现在,你又可以乘坐时光机回到未来了。

 

 

 

工作区和暂存区

 

 

工作区(Working Directory)

 就是你在电脑里能看到的目录

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第16张

版本库(Repository)

 

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

 

Git的版本库里存了很多东西,

其中最重要的就是称为stage(或者叫index)的暂存区

还有Git为我们自动创建的第一个分支master

以及指向master的一个指针叫  HEAD 

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第17张

 

 前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区

 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

 因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,

 所以,现在,git commit就是往master分支上提交更改。

 

 现在,我们再练习一遍,先对readme.txt做个修改,比如加上一行内容:

 

Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage.

 然后,在工作区新增一个LICENSE文本文件(内容随便写)。

 

使用git status 查看一下状态

Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第18张

Git非常清楚地告诉我们,readme.txt被修改了,

LICENSE还从来没有被添加过,所以它的状态是Untracked

 

现在,使用命令git add . readme.txtLICENSE都添加后,用git status再查看一下:

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第19张

 

 现在,暂存区的状态就变成这样了:

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第20张

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage)/ (indx),

然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第21张

 

 一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第22张

 

 现在版本库变成了这样,暂存区就没有任何内容了:

 Git入门 时光穿梭鸡 版本回退 工作区 暂存区 随笔 第23张

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄