一、新增文件

1、设置用户签名

签名的作用就是为了区分不同的人,方便查看版本的时候知道操作的人是谁。首次安装好git之后必须设置一下签名,否则无法提交代码。

另外,这里设置的签名跟你登录到远程仓的账号没有关系。

git config --global user.name 用户名
git config --global user.email 邮箱

2、初始化本地库

想通过git管理文件目录,首先要让git获取到管理权,所以要初始化。

git init



初始化成功,提示初始化了一个空的git仓库.git,这里的文件就别改动了,可以打开看看。

3、查看本地库状态

初始化本地库之后,就可以查看本地库的状态了。

git status



看下返回的3行分别说了啥:

  1. 本地库在master分支,master是默认生成的。
  2. 目前还没有提交过任何东西。
  3. 除了没有提交过,而且现在还没有什么东西需要你提交。

这时候新增一个文件的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常用命令详解、版本切换原理的更多相关文章

  1. Git 入门和常用命令详解

    git 使用使用教程   git 使用简易指南  常用 Git 命令清单 下载   https://git-scm.com/downloads 工作流 本地仓库由三部分组成. 工作区:保存实际的文件( ...

  2. Kubernetes,kubectl常用命令详解

    kubectl概述 祭出一张图,转载至 kubernetes-handbook/kubectl命令概述 ,可以对命令族有个整体的概念. 环境准备 允许master节点部署pod,使用命令如下: kub ...

  3. Hexo系列(三) 常用命令详解

    Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...

  4. hbase shell基础和常用命令详解(转)

    HBase shell的基本用法 hbase提供了一个shell的终端给用户交互.使用命令hbase shell进入命令界面.通过执行 help可以看到命令的帮助信息. 以网上的一个学生成绩表的例子来 ...

  5. H3C常用命令详解

    H3C常用命令详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1.关闭后台日志输出 <yinzhengjie>sys [yinzhengjie]undo info- ...

  6. hbase shell基础和常用命令详解

    HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服 ...

  7. DOS常用命令详解

    DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘 edit ...

  8. Linux常用命令详解上

    Linux常用命令详解上 目录 一.shell 二.Linux命令 2.1.内部命令与外部命令的区别 2.2.Linux命令行的格式 2.3.编辑Linux命令行的辅助操作 2.4.获得命令帮助的方法 ...

  9. samtools常用命令详解(转)

    转自:samtools常用命令详解 samtools的说明文档:http://samtools.sourceforge.net/samtools.shtml samtools是一个用于操作sam和ba ...

  10. cisco常用命令详解

    cisco常用命令详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用命令用法展示 1.命令行模式的来回切换 yinzhengjie>enable #从用户模式切换到 ...

随机推荐

  1. springboot2.0全局异常处理,文件上传过大会导致,方法被执行两次,并且连接被重置

    最后发现是内嵌tomcat也有文件大小限制,默认为2MB,我上传的是4MB,然后就炸了.在application.properties中添加server.tomcat.max-swallow-size ...

  2. P2731 骑马修栅栏 Riding the Fences 题解(欧拉回路)

    题目链接 P2731 骑马修栅栏 Riding the Fences 解题思路 存图+简单\(DFS\). 坑点在于两种不同的输出方式. #include<stdio.h> #define ...

  3. 如何在 ASP.Net Web Forms 中使用依赖注入

    依赖注入技术就是将一个对象注入到一个需要它的对象中,同时它也是控制反转的一种实现,显而易见,这样可以实现对象之间的解耦并且更方便测试和维护,依赖注入的原则早已经指出了,应用程序的高层模块不依赖于低层模 ...

  4. A New Stone Game POJ - 1740

    题目链接:https://vjudge.net/problem/POJ-1740#author=0 题意:有n堆石子,每次你可以选一堆拿走任意数量的石子,而且你还可以选择从这一堆剩下石子中取任意数量石 ...

  5. gstreamer应用开发(播放器)之旅

    GStreamer开发,主要分为两块:应用开发.插件开发. 插件开发人员,通常是编解码库的作者(做出了编解码库后,希望gstreamer能用起来这个库,因此增加这个适配层).芯片原厂人员(将自家的hw ...

  6. 《Selenium自动化测试实战:基于Python》之 Selenium IDE插件的安装与使用

    第3章  Selenium IDE插件的安装与使用 京东:https://item.jd.com/13123910.html 当当:http://product.dangdang.com/292045 ...

  7. 极速精简 Go 版 Logstash

    前言 今天来介绍 go-zero 生态的另一个组件 go-stash.这是一个 logstash 的 Go 语言替代版,我们用 go-stash 相比原先的 logstash 节省了2/3的服务器资源 ...

  8. 第14 章 : Kubernetes Service讲解

    Kubernetes Service 本文将主要分享以下四方面的内容: 为什么需要 K8s service: K8s service 用例解读: K8s service 操作演示: K8s servi ...

  9. Img2Latex 临时方法

    Img2Latex 临时方法 博客园Markdown编辑器中公式需采用Latex编写,然鹅现在并不想学习Latex 毕竟工科生,写论文也免不了的各种公式 (终极解决方案当然是学会Latex) 1.工具 ...

  10. OO结课了,狂喜

    OO结课了,狂喜 哈哈哈哈哈 哈哈哈 哈哈 哈 第十三次作业 UML类图 简要分析: 本次作业是对UML类图进行解析,给到的接口里面已经有了很多类了,但是自带的类肯定是没有反应这些类的结构的.所以就自 ...