Git学习记录--git仓库
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仓库的更多相关文章
- git 学习记录—— git 中的仓库、文件状态、修改和提交操作等
最近开始学习使用版本控制工具 git .学习方式主要通过阅读 git 网站上的 Pro git 和动手实践,使用的系统为 Ubuntu16.04LTS,以及 Windows 8.1. 本文主要关注 ...
- git学习记录——远程仓库(说白了就是代码放到githup上)
远程仓库 现在讲述的这些SVN都已经做到了,并没什么稀奇的地方 所以这节课赘述的是杀手级的东西——远程仓库githup ssh-keygen -t rsa -C "xxxxxxxxxxx@ ...
- Git学习记录 力做全网最强入门教程
目录 Git学习记录 力做全网最强入门教程 什么是GitHub? 什么是Git? Git的配置 Git的安装(只介绍windos操作系统下) Git的配置 至此我们的入门教程到此结束,更新中级教程要等 ...
- git学习——<五>git分支
git学习——<一>git安装 git学习——<二>git配置文件 git学习——<三>git操作 git学习——<四>git版本管理 一.提出问题 今 ...
- git学习——记录每次更新到仓库
记录每次更新到仓库 工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪.已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或 ...
- git 学习(1) ----- git 本地仓库操作
最近在项目中使用git了,在实战中才知道,以前学习的git 知识只是皮毛,需要重新系统的学一下,读了一本叫 Learn Git in a Month of Lunches 的书籍,这本书通俗易懂,使 ...
- Git学习记录-基本命令篇
目录 网页在线练习地址 https://learngitbranching.js.org/ 1.git commit Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然 ...
- Git学习记录(一)
本篇文章介绍Git的本地使用 Git是什么? Git是世界上最先进的分布式版本控制系统. 那么什么是版本控制系统? 我们来举个例子,假设我创建了一个项目Project.1,里面写了一个README.t ...
- GIT学习记录4(标签管理与自定义git)
学习参考地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本编随笔只是自己对 ...
随机推荐
- 响应式布局—设备像素密度测试 (-webkit-min-device-pixel-ratio)
最近遇到这种头疼的问题,百思不得其解,不耻下问,悬梁刺股这些事情都做过之后,终于看到希望,于是攒见好就收,感觉整理分享给大家,希望有所帮助. 对手机分辨率和网页像素的初步认识是,是2倍的差别. 但 ...
- 454ITS数据按barcode和primer分类程序v1.0
不知道有什么好办法可以让primer允许漏配,现在仅仅是允许错配,还是有一些没有配上,454数据有些primer漏配了一些,下一步解决这个问题 #include <cstdio> #inc ...
- Python配置文件实现
实现目标: 支持配置文件继承 支持本地配置文件 支持配置文件别名 简单的配置文件操作 最新的代码可以参考 https://github.com/blackmatrix7/matrix-toolkit/ ...
- Python 词云分析周杰伦《晴天》
一.前言满天星辰的夜晚,他们相遇了...夏天的时候,她慢慢的接近他,关心他,为他付出一切:秋天的时候,两个人终於如愿的在一起,分享一切快乐的时光但终究是快乐时光短暂,因为杰伦必须出国深造,两人面临了要 ...
- TurnipBit开发板“趣味赛”:平衡力大比拼
让孩子在快乐自由的游戏中培养编程思维 平衡力大挑战是我们经常经常玩的的一个小游戏,脑补画面的话比较常见的是单腿平衡力大比拼,摇晃幅度小者胜利.游戏好玩归好玩,但是想要公平判断胜负却不容易.下面就教大家 ...
- 云计算之路-阿里云上: RDS实例CPU跑满引发的故障
今天上午 10: 40 左右,我们所使用的阿里云 RDS 实例的 CPU 突然飙高到近 100% ,造成大量数据库查询操作缓慢.超时,在这个恶劣条件下大量 memcached 缓存无法建立,这样的雪上 ...
- Java框架之Hibernate(二)
本文主要介绍: 1 Criteria 接口 2 用 myeclipse 反向生成 3 hibernate 主键生成策略 4 多对一 5 一对多 6 使用List 集合的一对多 7 多对多 一.Cri ...
- vmvare centos 7.0 root密码忘记后重置及总结
今天遇到了一个比较尴尬的事情,我centos 7.0的虚拟机密码忘了.....里面还有我配置好的环境呢.于是我就上网上搜索各种方法,最后经我验证下面这个方法比较靠谱: 使用光盘修复Centos: ht ...
- adb 获取Android手机信息命令(2)
#Android命令 #获取手机名称 GET_PHONE_NAME = 'adb shell getprop ro.product.model' #获取手机版本 GET_PHONE_VERSION = ...
- 从Unity中的Attribute到AOP(三)
上一篇我们对系统的Attributes进行了MSIL代码的查看,了解到了其本质就是一个类的构造函数.本章我们将编写自己的Attributes. 首先我们定义书的属性代码,如下: [AttributeU ...