【Git】2. Git常用命令详解、版本切换原理
一、新增文件
1、设置用户签名
签名的作用就是为了区分不同的人,方便查看版本的时候知道操作的人是谁。首次安装好git之后必须设置一下签名,否则无法提交代码。
另外,这里设置的签名跟你登录到远程仓的账号没有关系。
git config --global user.name 用户名
git config --global user.email 邮箱
2、初始化本地库
想通过git管理文件目录,首先要让git获取到管理权,所以要初始化。
git init

初始化成功,提示初始化了一个空的git仓库.git,这里的文件就别改动了,可以打开看看。
3、查看本地库状态
初始化本地库之后,就可以查看本地库的状态了。
git status

看下返回的3行分别说了啥:
- 本地库在master分支,master是默认生成的。
- 目前还没有提交过任何东西。
- 除了没有提交过,而且现在还没有什么东西需要你提交。
这时候新增一个文件的hello.txt,再用git status看这里就不一样了。

出现一个新行:Untracked files,未被追踪的文件,红色标记。说明这个文件只在工作区,但是没有被git追踪。
最后一行的描述也变了,说目前还没有提交文件,但是存在未被追踪的文件。
4、添加暂存区
git的提示做的还是很友好的,基本上都会给你操作提示。接着上面来,现在如何让文件被追踪,提示说了,用git add。
git add

出现一个warning,说的是换行符自动替换处理,因为那个文件我直接在git-bash窗口用linux命令新建的,所以自动转化了win用的CRLF,不用管它。
现在重新查看下git status。

绿了,绿了,只不过不是古天乐(这是一个传奇页游广告的梗),而是刚才的hello.txt文件。
5、删除暂存区
现在这个文件也只是在暂存区里,暂存区里的文件是可以删掉的。如果现在我不想让这个文件产生一个历史版本,那么要在提交到本地仓库之前删掉它,就在暂存区删吧。
同样git也给了提示。
git rm --cached <file>

成功删除,但是记住这里删的是暂存区的,你本地工作区的文件没动,用ll查看一下。

6、提交本地库
把文件重新提交到暂存区,接下来就可以提交到本地库,形成一个历史版本了。
git commit -m "日志信息" 文件名

提交成功,看提示信息:
- [master (root-commit) a70616d],这里的
a70616d就是版本号了,这个是简短版的。 - 1 file changed, 19 insertions(+),1个文件被改变,插入了19行信息(文本里有19行内容)。
7、查看版本信息
刚才提交本地库产生一个版本信息,可以用这个命令查看。
git reflog

显示了刚才提交的版本信息。
a70616d是版本号。(HEAD -> master代表指针指向这个第一个版本。
还可以用这个命令查看更相信的版本信息:
git log

可以看到这里的版本号很长a70616d3fc1c69f948a7b0d4ed2b640bedb1e747,这个就是完整版的版本号了。
二、文件被修改后
上面是新增一个文件,但是最多的场景还是同一个文件被反复修改,现在我去修改hello.txt文件,增加写内容,然后git status。

提示有一个文件被修改了,红色表示还没有被追踪,那么重复上面的动作,提交到暂存区即可,用git add。提交成功了再次查看。

最后再提交本地库。

这里看到最后的提示,有一行新增,一行删除,可是我只是在第一行后面继续增加了内容。
因为git里面是按照行来维护文件的,我修改了第一行内容,实际上对于git来说,要先删除掉之前的第一行内容,然后再增加修改后的第一行内容。
现在查看版本信息git reflog。

可以看到:
- 有2个版本信息。
- 此时的指针是指向第二个版本。
三、版本穿梭
比如现在我想回退到之前某一个历史版本。
先查看历史版本,git reflog,目前我有3个版本。

我现在要回到第二次提交的版本,复制出版本号,使用如下命令:
git reset --hard 94ca3de

此时我再查看版本,发现指针已经移到了第二次提交的版本上了。

至于,第一行是告诉你做了一个reset的操作,目标版本号是什么。
git切换版本的原理
底层其实是移动HEAD指针。
可以先打开本地的.git下的HEAD,可以看到里面指针指向master,说明当前是在master分支上。

接着,可以打开.git/refs/heads/下面的master,可以看到里面的内容就是当前所在版本的版本号。

当继续切换版本到a70616d的时候,master文件里的版本号也会变更为对应的。

用示意图来描述的话,其实在我们刚提交完第三个版本的时候,应该是这样的:

当我们切换版本的时候,其实就是指针变了,比如现在切换到第二版本:

接下来,到了分支相关了。
【Git】2. Git常用命令详解、版本切换原理的更多相关文章
- Git 入门和常用命令详解
git 使用使用教程 git 使用简易指南 常用 Git 命令清单 下载 https://git-scm.com/downloads 工作流 本地仓库由三部分组成. 工作区:保存实际的文件( ...
- Kubernetes,kubectl常用命令详解
kubectl概述 祭出一张图,转载至 kubernetes-handbook/kubectl命令概述 ,可以对命令族有个整体的概念. 环境准备 允许master节点部署pod,使用命令如下: kub ...
- Hexo系列(三) 常用命令详解
Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...
- hbase shell基础和常用命令详解(转)
HBase shell的基本用法 hbase提供了一个shell的终端给用户交互.使用命令hbase shell进入命令界面.通过执行 help可以看到命令的帮助信息. 以网上的一个学生成绩表的例子来 ...
- H3C常用命令详解
H3C常用命令详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1.关闭后台日志输出 <yinzhengjie>sys [yinzhengjie]undo info- ...
- hbase shell基础和常用命令详解
HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服 ...
- DOS常用命令详解
DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘 edit ...
- Linux常用命令详解上
Linux常用命令详解上 目录 一.shell 二.Linux命令 2.1.内部命令与外部命令的区别 2.2.Linux命令行的格式 2.3.编辑Linux命令行的辅助操作 2.4.获得命令帮助的方法 ...
- samtools常用命令详解(转)
转自:samtools常用命令详解 samtools的说明文档:http://samtools.sourceforge.net/samtools.shtml samtools是一个用于操作sam和ba ...
- cisco常用命令详解
cisco常用命令详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用命令用法展示 1.命令行模式的来回切换 yinzhengjie>enable #从用户模式切换到 ...
随机推荐
- Educational Codeforces Round 98 (Rated for Div. 2)
A 如果\(n = m\),答案为\(2 \times n\):如果\(n \ne m\),答案为\(2 \times max(n,m) - 1\) #include <bits/stdc++. ...
- Java Swing 自定义Dialog确认对话框
Java Swing 自定义Dialog 需求:当点击JFrame窗口的关闭按钮时,弹框询问是否确定关闭窗口,如果是则关闭程序,否就让弹框消失什么也不做(使用Dialog). 分析:虽然Java提供了 ...
- 代码审查:从 ArrayList 说线程安全
本文从代码审查过程中发现的一个 ArrayList 相关的「线程安全」问题出发,来剖析和理解线程安全. 案例分析 前两天在代码 Review 的过程中,看到有小伙伴用了类似以下的写法: List< ...
- 怎么用Markdown在github上写书,并用pages展示
怎么用git写书 安装环境 第一步 安装node npm 先检测自己电脑是否安装了node npm # 查看 node 版本 node -v # 查看 npm 版本 npm -v 复制代码 如果成功打 ...
- 【java框架】SpringBoot(3) -- SpringBoot集成Swagger2
1.SpringBoot web项目集成Swagger2 1.1.认识Swagger2 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体 ...
- java集合【12】——— ArrayList,LinkedList,Vector的相同点与区别是什么?
目录 特性列举 底层存储结构不同 线程安全性不同 默认的大小不同 扩容机制 迭代器 增删改查的效率 总结一下 要想回答这个问题,可以先把各种都讲特性,然后再从底层存储结构,线程安全,默认大小,扩容机制 ...
- 从本质彻底精通Git——4个模型1个周期1个史观1个工作流
一.什么是Git? Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是Linus Torvalds为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软 ...
- Hi3516如何连接Wifi(二)
目录: 一.总体思路 二.启动Daemon 三.作者文章合集 书承上回(Hi3516如何连接Wifi(一)),上一篇聊了一下怎样在Hi3516中用wpa_supplicant连接到Wifi热点,本文讲 ...
- Class类文件结构--访问标志
访问标志的位置:在常量池结束之后的两个字节(16位)表示访问标志access_flags. 访问标志的作用:用于标识类或者接口层次的访问信息:比如该Class是类还是接口,是否为public类型.是否 ...
- Python基础(八):字符串的使用(下)
find() 功能:检测字符串是否包含指定字符.如果包含指定字符,则返回开始的索引:否则,返回-1. >>> st = "hello world" >> ...