Git是一款强大的版本控制工具,与svn相比git的分布式提交,本地仓库等在使用时确实比较方便。当然两者之间各有优劣,我在这里不多做比较。由于之前少有接触git,只是零星大致地了解一点,所以找时间系统地看了下廖老师的git入门教程。廖老师git入门教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000。

作为学习记录,我会跳过git的安装介绍等,也不会系统地挨个介绍使用的git命令。以下主要包括:

  * git仓库(Git仓库的介绍)

    * git本地仓库操作的执行过程(add,commit, diff,reset)

  * 总结

一、Git的仓库(版本库)

  1. Git的本地仓库

  其实就是版本库(repository),直观了解就是自己文件系统中的一个目录,这个目录里的文件可以被git工具管理,目录里文件的增删改都能被Git追踪到。

以下就是在git_learn目录下使用init命令创建的一个本地Git仓库,初始创建时,仓库是空的,需要add并commit才能让Git追踪仓库目录下的文件。

  2. Git本地仓库的构成

  当上面在空文件夹下执行 git init 命令后,我们说在当前目录下的Git仓库就创建好了,那创建好的Git仓库到底是什么样呢,除了多了一个隐藏的.git 文件目录,似乎什么也没有。其实,初始化成功后我们的当前目录已经被分成了两个部分,一个是工作区,另一个就是版本库。所谓工作区就是我们能在这个目录下操作文件,进行工作,比如写代码啊T_T。版本库就是那个生成的.git目录了,里面主要包括暂存区(index指向)和版本区(HEAD指向,这个“”版本区“”只是我个人的叫法)。版本区就是放分支的地方,里面会有Git为我们创建的第一个分支,名为master。这里的index和head可以理解为指针的作用。下图就是仓库创建后的样子。

二、Git本地仓库的操作流程

  1. 操作流程

  工作区的文件我们是可以任意添加修改的,修改的文件需要从工作区通过add命令添加到暂存区,再从暂存区commit到版本区。我们也可以从从仓库checkout文件到工作区,操作关系如下图:

  2 .Git的add与commit

  在工作区创建文件file.txt并将改文件提交到Git本地仓库,整个过程执行如下:

两步,add 和commit就将file.txt文件的第一个版本加入了git仓库,看看其过程:

工作区创建file.txt第一个版本,这时git仓库并没有追踪到这个文件。

将file.txt添加到暂存区(index指向),这时暂存区的文件和工作区同步。

最后将暂存区的提交到版本区(HEAD指向),这时版本区会自动生成此次提交的版本号,这时file文件已经被git仓库追踪到。

以上操作都是在初始生成的master分支上完成,每次提交成功后HEAD都会指向版本区中当前分支的最新版本,这里使用master分支提交,所以HEAD指向master分支的当前最新版本,目前只有一个版本(master分支只有一个提交,每次提交形成一个版本,并生成唯一版本号),如果存在多个分支,切换分支时,HEAD就会指向切换到的分支的最新版本。存在分支存在多个版本(多次提交)会形成类似链表的结构。所以在当前仓库版本区(只有master分支,且只有一个提交)具体来说应该是这样的:

现在编辑file.txt文件,添加一行,形成v2版本(v1是新建的空文件),再执行add和commit,我们依然是在master分支上提交的,这时候file.txt就应该有两个版本了,且是在master分支上,HEAD应该指向的是master的最新分支。

git仓库中的版本区,master分支上存在两个版本,HEAD指向master分支的最新版本:

  3. Git的版本重置 reset

  git的版本可以向前向后移动,如同指向双向链表中的某个节点的指针一样。这里的指针其实就是HEAD,执行reset命令其实就是移动HEAD指向分支上的另一个版本(每一次提交都会形成一个版本)。

例如,我在file.txt中又有修改并且形成了v3版本,现在我想要将file.txt文件回退到上一次提交(v2版本),可以使用  git reset HEAD~1 ,前面说过,每次提交都有版本号,可以通过log和reflog查看提交的版本号,使用git reset 9e5e6a4,来将HEAD重新指向到v2版本。版本号挺长的,但不用写完一般写前面几个就够了。但这是分支上的v3版本依然存在(如同移动指向链表节点的指针,链表节点依然在).

在master分支上回退一次的操作应该是这样:

可以看到,在版本区,HEAD的指向已经指向了master分支的v2版本上,前面说到,git仓库里除了版本区还有暂存区(index指向)和工作区(我们能看到的并工作的目录中)是什么样子呢?

这里reset 有三个可选参数:git reset [--soft | mixed | hard]

git reset --soft HEAD~1:

soft参数,由于提交了v3版本,在执行reset命令之前,暂存区(index)和工作区应该都是v3版本,执行git reset --soft HEAD~1 之后,暂存区和工作区依然是v3版本,简单来说我们再工作目录看到的依然是v3的内容,只是仓库里的版本区当前版本已经指向了v2.

git reset --mixed HEAD~1:

  mixed参数,这个参数是默认参数。分成两个步骤,首先将HEAD指向改变,再将暂存区(index)与HEAD指向的当前版本同步(到v2版本),工作区依然不变(保留v3版本)。

git reset --hard HEAD~1:

  hard参数,改变HEAD指向,并且将暂存区与工作区全部同步到v2版本,这个时候我们我们可以通过文件直接看到v3版本新添加的内容不见了,回到了v2版本。

当然,我们虽然到了v2版本,那我们依然可以通过reset命令到v3版本,同样的道理。

这里关于reset命令的操作过程我只是简要描述了一下,这里有一篇非常好的讲解,很详细:https://www.cnblogs.com/kidsitcn/p/4513297.html

  4.git 的diff命令

  比较区别,弄清楚git仓库的组成部分就很容易想到比较啦。反正就是这样:

git diff  :  工作区与暂存区比较

git diff --cached    : 暂存区与HEAD指向版本比较

git diff HEAD  :  工作区与HEAD指向版本直接比较

git diff 版本号1 版本号2   :     比较两个版本号对应版本版本的不同

三、总结

  Git仓库主要包括三部分:工作区,暂存区,版本区。 我们对文件的操作是在工作区进行,完成修改后先要将修改内容添加到暂存区,然后再提交到版本区形成一个版本。至于为什么git要设置一个暂存区这样一个中间层,想到一句话调侃的话:没有什么问题是添加一个中间层解决不了的,若有,那就添加两层。想想,如果我们一次要修改的东西太多,我想每写一点东西就先存起来但是又不想让它形成一个版本提交(因为没写完啊,提交的时候需要些commit comment的),那就写一点就提交到暂存区诺,写完后再一次commit。或者正在开心的写着代码,写着一半突然需要切换到另一个分支去修复bug,那就将当前工作内容放到暂存区,然后利用stash功能将暂存区内容打包存起来,等修复完bug再回来恢复继续。另外就是git的status功能,这个功能比较简单,主要显示就是当前仓库的状态,是否有内容需要add到暂存区,是都有暂存的内容需要commit到版本区等等。

Git学习记录--git仓库的更多相关文章

  1. git 学习记录—— git 中的仓库、文件状态、修改和提交操作等

    最近开始学习使用版本控制工具  git .学习方式主要通过阅读 git 网站上的 Pro git 和动手实践,使用的系统为 Ubuntu16.04LTS,以及 Windows 8.1. 本文主要关注 ...

  2. git学习记录——远程仓库(说白了就是代码放到githup上)

    远程仓库 现在讲述的这些SVN都已经做到了,并没什么稀奇的地方 所以这节课赘述的是杀手级的东西——远程仓库githup ssh-keygen -t rsa  -C "xxxxxxxxxxx@ ...

  3. Git学习记录 力做全网最强入门教程

    目录 Git学习记录 力做全网最强入门教程 什么是GitHub? 什么是Git? Git的配置 Git的安装(只介绍windos操作系统下) Git的配置 至此我们的入门教程到此结束,更新中级教程要等 ...

  4. git学习——<五>git分支

    git学习——<一>git安装 git学习——<二>git配置文件 git学习——<三>git操作 git学习——<四>git版本管理 一.提出问题 今 ...

  5. git学习——记录每次更新到仓库

    记录每次更新到仓库 工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪.已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或 ...

  6. git 学习(1) ----- git 本地仓库操作

    最近在项目中使用git了,在实战中才知道,以前学习的git 知识只是皮毛,需要重新系统的学一下,读了一本叫  Learn Git in a Month of Lunches 的书籍,这本书通俗易懂,使 ...

  7. Git学习记录-基本命令篇

    目录 网页在线练习地址 https://learngitbranching.js.org/ 1.git commit Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然 ...

  8. Git学习记录(一)

    本篇文章介绍Git的本地使用 Git是什么? Git是世界上最先进的分布式版本控制系统. 那么什么是版本控制系统? 我们来举个例子,假设我创建了一个项目Project.1,里面写了一个README.t ...

  9. GIT学习记录4(标签管理与自定义git)

    学习参考地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本编随笔只是自己对 ...

随机推荐

  1. java inputstream to string stack overflow

    https://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string 过千赞的答案

  2. Javascript高级程序设计笔记 <第五章> 引用类型

    一.object类型 创建object实例的方式有两种: //第一种使用new操作符跟构造函数 var person= new Object(); person.name="小王" ...

  3. C语言学生管理系统(增进版)

    在原版上进行改进,主要改进的功能有. 1.利用atof:将字符串转换为浮点型: 利用atoi:将字符串转换为整型: 原文地址:http://www.cnblogs.com/sddai/p/577412 ...

  4. Python学习_09_模块

    模块 模块是python中的最高组织单元,在物理层面上,模块以文件存储,模块的文件名就是模块的名字.py,每个模块都有自己的名称空间. python按照路径搜索来查找模块文件,在PYTHONPATH环 ...

  5. Netty对Protocol Buffer的支持(七)

    Netty对Protocol Buffer的支持(七) 一.简介 在上一篇博文中笔者已经介绍了google的Protocol Buffer的使用,那么本文笔者就开始介绍netty对Protocol B ...

  6. Ubuntu16.04安装配置sublime text3

    1.安装Sublime Text 3 首先添加sublime text 3的仓库: sudo add-apt-repository ppa:webupd8team/sublime-text-3 根据提 ...

  7. Atlas 安装报错 package Atlas-2.2.1-1.x86_64 is intended for a x86_64 architecture

    安装atlas 报错: package Atlas-2.2.1-1.x86_64 is intended for a x86_64 architecture 百度了好久没找到相关信息,最后看见官网文档 ...

  8. TensorBoard的使用(结合线性模型)

    TensorBoard是TensorFlow 的可视化工具.主要为了更方便用户理解 TensorFlow 程序.调试与优化,用户可以用 TensorBoard 来展现 TensorFlow 图像,绘制 ...

  9. Intellij Idea中Backspace无法使用,Ctrl+c/Ctrl+d等等快捷键无法使用的问题的解决

    1:作为一个强迫症的我使用习惯了Eclipse,可能是对快捷键的依赖性,都说Idea是开发Java的最好工具,下载,安装等等(过程省略,百度很多方法),这里说一下我遇到的窘迫问题.哎,真是有时候看似天 ...

  10. CSS(一) 引入方式 选择器 权重

    Css(一) Cascading Style Sheet 层叠样式表 css注释方式/*  */ 一.Css引入方式 1. 行间样式 style=" key:value; " &l ...