分布式集中式

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 init  命令把这个目录变成Git可以管理的仓库:

缓存文件 提交文件

在该目录下编写一个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 commit命令,   -m 后面输入的是本次提交的说明,可以输入任意内容,

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

时光机穿梭  版本回退

修改readme.txt文件

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

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

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

git status 查看当前版本库状态

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

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

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

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

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

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

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

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

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

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

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

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

进行提交 $ git commit -m""

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

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

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

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

 然后缓存改动  并 提交

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

就好比玩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 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表示当前版本

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

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

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

  $ git reset --hard HEAD^

    hard很危险

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

   

  使用git log 查看一下版本库

  

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

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

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

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

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

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

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

     

git reflog

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

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

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

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

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

工作区和暂存区

工作区(Working Directory)

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

版本库(Repository)

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

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

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

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

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

前面讲了我们把文件往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非常清楚地告诉我们,readme.txt被修改了,

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

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

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

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

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

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

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

Git入门 时光穿梭鸡 版本回退 工作区 暂存区的更多相关文章

  1. Git(1):版本库+工作区+暂存区

    参考博客:https://blog.csdn.net/qq_27825451/article/details/69396866

  2. git中的版本库,暂存区和工作区

  3. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  4. 第二课 ---git时光穿梭(版本回退)

    1.  git  status  掌握仓库当前的状态. 2.  git  diff 查看修改的内容部分. //版本回退: 1.查看更新的历史记录. git log git log --pretty=o ...

  5. Git 时光穿梭鸡 删除文件 以及批量删除文件

    先添加一个新文件test.txt到Git并且提交: 一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了 $ rm test.txt 这个时候,Git知道你删除了文件, 因此,工作 ...

  6. Git 时光穿梭鸡 撤销修改

    工作区内容修改了, 但是并未add到暂存区, 想 回退到上一个版本 在readme.txt中添加了一行: Git is a distributed version control system. Gi ...

  7. 『现学现忘』Git后悔药 — 31、reset版本回退命令总结

    目录 1.--soft回退说明 2.--mixed回退说明 3.--hard回退说明 4.总结 在Git中进行版本回退需要使用git reset命令. 以前面文章中的示例为例,当我准备在V4版本,回退 ...

  8. GIt学习第二天之版本回退、工作区和暂存区

    搬运自 ‘廖雪峰的官方网站’ 地址:https://www.liaoxuefeng.com/ 1.版本回退 在Git中,我们用git log命令显示从最近到最远的提交日志,如果嫌输出信息太多,看得眼花 ...

  9. [git]入门-工作区、暂存区、版本库

    转载整理自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256 ...

随机推荐

  1. 我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸

    该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供 ...

  2. 使用maven3 创建自定义的archetype

    创建自己的archetype一般有两种方式,比较简单的就是create from project 1.首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应 ...

  3. 提高iOS开发效率的第三方框架等--不断更新中。。。

    1. Mantle Mantle 让我们能简化 Cocoa 和 Cocoa Touch 应用的 model 层.简单点说,程序中经常要进行网络请求,请求到得一般是 json 字符串,我们一般会建一个 ...

  4. office 2010 激活工具 迷你KMS使用说明

    “迷你KMS”——“”体态轻盈仅只1MB.但却一身承担两大职能:KMS服务器和客户激活端.“迷你KMS”可激活Microsoft Office 2010系列三大版本,以及Windows 7企业.专业版 ...

  5. VLAN(虚拟局域网)划分

    VLAN根据不同的需求,可以有多种划分方式: 一:静态划分 基于端口             按VLAN交换机上的物理端口和内部的PVC(永久虚电路)端口来划分 静态划分安全.可靠,易于配置与维护 二 ...

  6. BZOJ 1041 [HAOI2008]圆上的整点:数学【费马平方和定理】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 题意: 给定n(n <= 2*10^9),问你在圆x^2 + y^2 = n^ ...

  7. IDEAL葵花宝典:java代码开发规范插件 p3c

    前言: P3C插件 是阿里巴巴p3c项目组进行研发.这个项目组是阿里巴巴开发爱好者自发组织形成的虚拟项目组,根据<阿里巴巴Java开发规范>转化而成的自动化插件,并且实现了部分自动编程. ...

  8. ZOJ 3805 Machine(二叉树,递归)

    题意:一颗二叉树,求  “  宽度  ” 思路:递归,貌似这个思路是对的,先记下,但是提交时超时, 1.如果当前节点只有左孩子,那么当前宽度等于左孩子宽度 2.如果当前节点只有右孩子,那么当前宽度等于 ...

  9. blog集合

    godiscoder的技术blog 一个不错的技术架构设计blog MySQLOPS 数据库与运维自动化技术分享 stone的技术blog 陈皓专栏 风雪涟漪的技术blog 华为首席科学家 张宴技术b ...

  10. L89

    His voice was hoarse after several hours' speech.Attributive adjectives precede the noun.I gave the ...