git 工作原理图

如上图所示,有三个区域Working Directory、stage、master。
名词解释:

工作区(Working Directory)
在我们直接编辑文件(文件夹)的根目录,如下图:

在G盘Git目录下就是工作区

版本库(Repository)
版本库才是git正式工作的地方,在工作区下隐藏目录里,如下图:

版本库主要包括两个区,如上图,包括“stage”和“master”。

  • master
    master区管理了我们每次提交后的文件版本以及相关信息,是git最重要的仓库。在master区,有一个head指针(见图1),指向最新提交的版本。

  • stage
    stage是工作区到master区的缓存区,在做小的修改时我们可以先提交到stage,确定没有问题了,或者当天的工作完成了,再把缓存区的内容最终提交到master。

工作原理
上篇博客里讲了命令行:git add、git commit
其中执行git add的时候,是把在“Working Directory”去修改(增加或删除)的内容提交到“stage”

执行git commit之类的时候,把“stage”的内容最终提交到“master”区。

git status
命令行git status 能够帮助我们快速的了解git的当前状态。
例如,我们现在工作区新增一个test3.txt文件(先不要添加到版本库),然后执行git status。

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)test3.txtnothing added to commit but untracked files present (use "git add" to track)

从上面的代码我们可以看出,有在工作区新文件(test3.txt)待提交,但从stage区到master区没有新内容提交。
所以根据上篇博客的知识,先用git add把test3.txt提交到stage。执行指令git add后,再使用git status查当前git状态,如一下代码:

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git add test3.txtchenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   test3.txtchenxi@chenxi_pc MINGW64 /G/Git (master)

从上面的的结果知道已经成功添加到status,准备好等待我们提交到master,执行git commit可以完成提交任务,如下图:

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git commit -m "add test3.txt file"
[master 39e0dba] add test3.txt file1 file changed, 1 insertion(+)create mode 100644 test3.txtchenxi@chenxi_pc MINGW64 /G/Git (master)chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
nothing to commit, working directory cleanchenxi@chenxi_pc MINGW64 /G/Git (master)

版本回退

通过前面我们已经掌握了提交新版本,如果发现我修改错了东西,怎样返回新版本呢?
我们修改test.txt文件,添加新内容,如下:

执行git add、git commit指令,如以下代码:

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified:   test.txtno changes added to commit (use "git add" and/or "git commit -a")chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git add test.txtchenxi@chenxi_pc MINGW64 /G/Git (master)
$ git commit -m "add hello world to test.txt"
[master 78db795] add hello world to test.txt1 file changed, 6 insertions(+), 1 deletion(-)chenxi@chenxi_pc MINGW64 /G/Git (master)

再在上面的基础上添加新内容,如下图:

并提交:

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git add test.txtchenxi@chenxi_pc MINGW64 /G/Git (master)
$ git commit -m "add hello CSDN to test.txt"
[master 8f4ae6d] add hello CSDN to test.txt1 file changed, 2 insertions(+)chenxi@chenxi_pc MINGW64 /G/Git (master)

好,现在我们使用log指令查一下我们都执行了哪些操作:

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git log
commit 8f4ae6dc10a67a0a5726f449c6c65e288d39f57f
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 20:23:18 2017 +0800add hello CSDN to test.txtcommit 78db795dabdeb752d635ed2960b87ec49bb13943
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 20:15:46 2017 +0800add hello world to test.txtcommit 39e0dba93090a1f01887180e7bedbb7dda1fe5b3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 19:36:40 2017 +0800add test3.txt filecommit 63d890ed08ee938dc4e83ad14446727dc9d55da3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Dec 30 17:43:55 2016 +0800add test1.txt and test2.txt filescommit 489b113d392d1bc930f6eef1b6f0135d6bd6e0d3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Dec 30 12:13:05 2016 +0800add panoramaProjects folder:...skipping...
commit 8f4ae6dc10a67a0a5726f449c6c65e288d39f57f
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 20:23:18 2017 +0800add hello CSDN to test.txtcommit 78db795dabdeb752d635ed2960b87ec49bb13943
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 20:15:46 2017 +0800add hello world to test.txtcommit 39e0dba93090a1f01887180e7bedbb7dda1fe5b3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 19:36:40 2017 +0800add test3.txt filecommit 63d890ed08ee938dc4e83ad14446727dc9d55da3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Dec 30 17:43:55 2016 +0800add test1.txt and test2.txt filescommit 489b113d392d1bc930f6eef1b6f0135d6bd6e0d3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Dec 30 12:13:05 2016 +0800add panoramaProjects foldercommit 664376a8783c533c90731dd00e4093d8bff9e97b
Author: chenximcm <1178898205@qq.com>
Date:   Fri Dec 30 12:10:09 2016 +0800add test.txt file
~
~chenxi@chenxi_pc MINGW64 /G/Git (master)

好多啊,是不是觉得输出太多信息了,没事,我们可以把每次的信息只输出精简信息,我们只需要在git log 后面添加参数“–pretty=oneline”即可。

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git log --pretty=oneline
8f4ae6dc10a67a0a5726f449c6c65e288d39f57f add hello CSDN to test.txt
78db795dabdeb752d635ed2960b87ec49bb13943 add hello world to test.txt
39e0dba93090a1f01887180e7bedbb7dda1fe5b3 add test3.txt file
63d890ed08ee938dc4e83ad14446727dc9d55da3 add test1.txt and test2.txt files
489b113d392d1bc930f6eef1b6f0135d6bd6e0d3 add panoramaProjects folder
664376a8783c533c90731dd00e4093d8bff9e97b add test.txt filechenxi@chenxi_pc MINGW64 /G/Git (master)

是不是把目前不需要的信息都省掉了?每条信息只给出版本号跟我们添加的日志描述信息。如果你觉得最后一次操作有问题(添加的hello CSDN),想返回到前面的按个版本,怎么办?

只需要执行指令:“git reset –hard HEAD^”

HEAD前面说过有个HEAD指针指向最新提交的版本,HEAD^表示当前版本的前面那个版本,HEAD^^表示前前个版本,如果想返回前面第100个版本,是不是可以写100个“^”。

O(∩_∩)O哈哈~,让我想起了以前小时候老师讲的一个故事,一个小学生学习了中文的一、二、三,他就说后面的他都会了,就没去上课,回家他老爸让他写一个万字,他写了一个下午。(小插曲)

当然上面的方法也可以,不过我们都没那么蠢吧。我们可以使用HEAD~100代替。

如上图,我们执行了git reset –hard HEAD^后,是不是返回到前面那个版本了“78db795dabdeb752d635ed2960b87ec49bb13943 add hello world to test.txt

再去查看一下我们的test.txt文件是不是也回到前面那个版本,如下图:

惨了,我们前面那个版本了(add hello CSDN…),怎么办?
不慌不慌,我们还可以通过前面的版本ID号返回去呢。版本号辣么长,我要晕了…放心,git不会这么麻烦的,你只需要输入其中连续的几个版本号字符就可以了(一般6位),这样git就能辨别了。
如下图:

又回来了,开不开心?O(∩_∩)O哈哈~!当然你也可以通过版本号返回到其他的版本。

在master去,有个HEAD指针,该指针指向当前的版本,返回到第n个版本就是通过修改HEAD指针的值实现,如上图。

删除文件

小结

  • git版本库主要的三个工作区域工作区、stage、master。
  • git status查询当前状态
  • 通过git reset –hard HEAD^返回以前版本的信息
  • 通过git reset –hard 版本号返回版本号对应的版本

Git 版本控制原理相关推荐

  1. git ssh配置完后拉取代码_CentOS6自带git版本需要用户名才能拉取代码

    问题 当我们在CentOS6操作系统执行git操作,发现拉取代码的时候会出现如下的提示: $ git clone http://xxxxx.giterror: The requested URL re ...

  2. Git版本库创建(包含文件权限设置 Linux环境下)

    确保git服务已安装成功,如果没有安装git服务查看:Git源码安装 Linux指定安装目录 1.创建git用户,并设置密码.并禁止git用户通过shell登录服务器(注意如果需要安装gitolite ...

  3. 解决git提交敏感信息(回退git版本库到某一个commit)

    解决git提交敏感信息(回退git版本库到某一个commit) Fri 07 June 2013 git是一个很好的版本库, 现在很多人用它, 并在github上创建项目, 相信大家都有过将敏感信息提 ...

  4. 【Git】Git 基础命令 ( Git 版本库概念 | 创建版本库 git init | 克隆版本库 git clone )

    文章目录 一.Git 版本库概念 二.创建版本库 git init 三.克隆版本库 git clone 一.Git 版本库概念 Git 版本库概念 : Git 版本库 Repository 又称为 G ...

  5. 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流

    GitHub操作总结 : 总结看不明白就看下面的详细讲解. . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details ...

  6. Git版本服务器搭建(CentOS)--gitblit

    2019独角兽企业重金招聘Python工程师标准>>> 一.CentOS下安装gitblit-1.7.1.jar 1.下载gitblit-1.7.1.jar 2.目录结构 3.进入d ...

  7. 在visual studio中使用git版本系统(zz)

    第一部分: 安装 git 开发工具 如果要使用 git 进行版本管理,其实使用 git 命令行工具就完全足够了,图形化工具(无论是 git extentions ,还是TortoiseGit),都只不 ...

  8. CentOS7升级Git版本

    CentOS7 如何升级Git CentOS7自带的git版本1.8.3.1,这个版本有点低了.于是决定折腾升级,我首先想到的是用update更新: yum update git 结果,事与原违,还是 ...

  9. 详解在visual studio中使用git版本系统(图文)

    第一部分: 安装 git 开发工具 如果要使用 git 进行版本管理,其实使用 git 命令行工具就完全足够了,图形化工具(无论是 git extentions ,还是TortoiseGit),都只不 ...

  10. Spring Boot中使用Actuator的/info端点输出Git版本信息

    对于Spring Boot的Actuator模块相信大家已经不陌生了,尤其对于其中的/health./metrics等强大端点已经不陌生(如您还不了解Actuator模块,建议先阅读<Sprin ...

最新文章

  1. 千万级游标_在一个千万级的数据库查寻中,如何提高查询效率
  2. linux 内存显示括号内字母的含义
  3. rabbitmq-5-案例2-简单的案例+exchange
  4. android 设置PopupWindow的显示大小
  5. Paxos Made Simple 中文翻译
  6. 【C++专题】static_cast, dynamic_cast, const_cast探讨
  7. applyDimension的用法
  8. 计算机学业水平测试字处理多少分,【计算机应用论文】计算机应用基础学业水平的测试问题(共3624字)...
  9. web前端技巧:如何在浏览器地址栏执行html代码
  10. java避免空指针异常
  11. 【渝粤教育】国家开放大学2018年春季 7215-21T电气传动与调速系统 参考试题
  12. 图像分割-连通区域分析
  13. 元气骑士如何获得机器人成就皮肤_元气骑士成就系统攻略 成就获取方法一览...
  14. 【DB笔试面试622】在Oracle中,说说COUNT(*)计算行数有哪些优化手段?
  15. 发射瞬时速度约束下的弹道导弹轨迹仿真算法
  16. sprintf你知道多少
  17. 【深度学习】FPN(特征金字塔)简介:Feature Pyramid Networks for Object Detection
  18. asp.net小说网站案例
  19. android添加任务到最近任务列表
  20. MP3格式转WAV格式

热门文章

  1. php 显示探针_UPUPW PHP探针安全版19.08.06
  2. 苹果app(iOS app)比较常用的URL schemes,可以用于iOS应用间相互调用
  3. 哈工大2021年秋季学期数据结构期末试题
  4. oki5530sc打印错误_我用的是四通oki 5530sc针式打印机,打印时提示正在打印,但就是不打印...
  5. 企业如何去选择适合的内网安全管理软件?
  6. 计算机多媒体制作三级证书,媒体报道:计算机职业资格证书有哪些
  7. 关于一般公司加密软件的处理程序实现解密方法
  8. 控制系统分析与设计(一):控制系统分类及建模
  9. 【测试沉思录】7. 测试左移的一点思考
  10. ALSA声卡驱动二之声卡的创建