版本之间穿梭切换

  • 1. 版本回退
  • 2. 回退版本
  • 3. 工作区和暂存区
  • 4. 管理修改
  • 5. 撤销修改
  • 6. 删除文件

再穿梭前,我们先修改readme.txt文件,修改为:

Git is a distributed version control system.
Git is free software.

运行git status命令看看结果:

git status命令可以让我们时刻掌握仓库的当前状态,例如上面的信息告诉我们readme.txt文件被修改了,还没有add所以不能commit

如果不知道或忘记了修改了什么,可以使用git diff查看修改的具体内容(diff就是difference的缩写):

红色文字前面有个减号-的就是删除的,绿色的前面有个加号+的就是新增的,以上信息告诉我们第一行新增了一个单词distributed

知道了修改了什么就可以放心提交了,提交还是两步骤,第一步先git add,然后使用git status查看下状态:

这里信息告诉我们将要提交的修改包括readme.txt文件,然后第二步就可以提交了:

提交完成后,再使用git status查看仓库的当前状态:

上面信息说明没有需要提交的修改,而且工作目录是干净的。

1. 版本回退

先再来练习下,再修改一个版本,修改文件为:

Git is a distributed version control system.
Git is free software distributed under the GPL.

然后提交:

现在已经有3个版本的提交记录,使用git log查看:

git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是add a readme file

如果嫌信息太多,可以加上--pretty=oneline就可以:

上面显示的一大串的字符是commit id(版本号),这是SHA1计算出来的一个非常大的数字,用十六进制表示,每个人的不一样,以自己的为准。

为什么commit id需要一大串字符表示呢?因为Git是分布式的版本控制系统,避免大家版本号冲突。

2. 回退版本

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交cc1510...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

现在,我们要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset命令:

这里的HEAD^加引号是因为windows系统会把^当作换行符,不加引号会显示“more?”,如果你看到了不要奇怪哦。

先来看看文件还原了没有:

果然还原了。

再用git log看看现在版本库的状态:

额。。。最新的append GPL版本不见了!那怎么回到最新的版本呢?如果你没有清命令行记录还是可以找到commit id的,如果清了咋办呢?
还是有办法的,Git提供了一个命令git reflog用来记录你的每一次命令:

终于看到了append GPLcommit idcc1510e,所以可以回去了:

commit id可以不用写全,前几位就可以了,只要能唯一代表就可以。

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL

改为指向add distributed

然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

3. 工作区和暂存区

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区:

版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git版本库

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区
第二步是用git commit提交更改,实际上就是把暂存区所有内容提交到当前分支

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

例如:我们再修改下readme.txt,然后再加一个LICENSE文件
使用git status查看下状态:

可以看到readme.txtChanges not staged for commit(没有添加到暂存区,不能提交),而LICENSE是Untracked files(新文件没有被跟踪),使用git add后再看下状态:

现在,暂存区的状态就变成这样了:

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

现在版本库变成了这样,暂存区就没有任何内容了:

4. 管理修改

为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件
修改:新增一行,修改字符,删除一行/字符,创建文件。。。

例如:

  • readme.txt加一行
  • git add添加暂存
  • 再修改readme.txt刚才加的一行
  • git commit提交到分支
  • git status查看状态

    额。。。第二次修改没有被提交?为什么呢?

回顾操作:第一次修改 -> git add -> 第二次修改 -> git commit
因为第二次修改没有加到缓存区,而git commit只提交缓存区的修改到当前分支,所以只提交了第一次的修改。

使用git diff查看下:

可见第二次确实没有修改,我们可以继续git addgit commit,也可以和后面修改的文件一起add再一起commit

5. 撤销修改

如果不小心修改错了文件,怎么撤回呢?这里有两种情况:

  1. 修改后还没有add到暂存区
  2. 已经add到暂存区了,又做了修改

先来看情况1(未add到暂存区):

git提示我们git restore可以丢弃工作区的修改,执行后工作区的文件被还原了。

情况2(已add到暂存区):
可以先用git restore --staged将文件从暂存区退回到工作区:

然后再使用git restore丢弃工作区的修改:

然后再看下状态,是clean状态的:

如果已经提交到分支了,那就直接回退版本就行了。

6. 删除文件

先添加一个文件test.txt,并提交:

此时删除文件:

然后这里有两个选择,一是误删了需要恢复,二是真的需要删除:

  1. 恢复删除的文件

    此时文件又回来了,工作区和版本库相同了。

  2. 确认删除
    使用git rm删除文件提交到暂存区,然后再git commit提交到当前分支

    现在文件就从版本库删除了。

【三】版本之间穿梭切换相关推荐

  1. 安装多版本JDK以及多版本之间的切换

    1.先安装一个jdk,做好相应的环境变量的配置. 2.安装第二个jdk,在配置环境变量的时候,我们只需要配置java_home. 配置成下面的效果: 我们要用到哪个版本的jdk.就修改这里: 添加运行 ...

  2. 〖Linux〗多个JDK版本之间快速切换

    由于工作的需要,经常要切换JDK版本比如我HOME目录下有三个JDK版本: ~/apt/jdk1.6.0_34 # JDK6 ~/apt/jdk1.7.0_67 # JDK7 ~/apt/jdk1.8 ...

  3. ubuntu中 不同JDK版本之间的切换

    Ubuntu中JDK 的切换前提是同时安装了多个版本,如jdk7和jdk8,若要切换,在终端输入: sudo update-alternatives --config javasudo update- ...

  4. windows下JDK版本之间的切换

    安装JDK的时候个人比较推荐使用压缩包的方式安装. 如果你的电脑存在多个JDK版本的时候,如果使用的是压缩包解压的方式安装的话,你可能仅仅需要更改一下JAVA_HOME环境变量 你敲java -ver ...

  5. python3版本切换_让你在python2和3二个版本之间自由切换自由翱翔

    背景: 我们都知道,即有python2又有python3的时候,我们往往无法快乐的翱翔的尽情的使用python,嘿嘿,反正谁用谁知道呢,哈哈,来来,上个流程,保证你有能力在python2和3之间欢乐的 ...

  6. 【重难点】【计算机网络 02】TCP 和 UDP 的区别、TCP 的三次握手和四次挥手、HTTP 和 HTTPS、HTTP 各版本之间的区别、HTTP 如何实现长连接

    [重难点][计算机网络 02]TCP 和 UDP 的区别.TCP 的三次握手和四次挥手.HTTP 和 HTTPS.HTTP 各版本之间的区别.HTTP 如何实现长连接 文章目录 [重难点][计算机网络 ...

  7. git的使用学习(三)时光机穿梭

    1.版本回退 现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: Git is a distributed version control ...

  8. 几种主要的Linux版本之间的比较

    我们很难从大量Linux版本中选择一款正好适合某个特定环境的版本.每一个版本都有自己的侧重点,有一套自己的文件,安装方式和自己的Linux内核版本.本文我将比较四种主要的Linux版本--Debian ...

  9. windows下同一个显卡配置多个CUDA工具包以及它们之间的切换

    1.多版本的CUDA以及cudnn安装 2.不同版本的tensorflow在CUDA之间的切换 3.验证自己的CUDA是否安装成功 前面的一片文章里面讲到了tensorflow.NVIDIA显卡驱动. ...

最新文章

  1. Machine Learning week 3 quiz: programming assignment-Logistic Regression
  2. Base64加密解密算法的C/C++代码实现
  3. 【杂谈】AI工业界都有哪些值得参加的比赛?
  4. python爬取主播信息
  5. dynamic web module 2.5与2.4
  6. SpringBoot中注入ApplicationContext对象的三种方式
  7. 这不仅仅是html5的HTML5问题
  8. 描述符演练-02-逻辑疏理-类的装饰器
  9. Service Manager流程,派BC_REPLY,唤醒FregServer流程,返回BR_TRANSACTION_COMPLETE,睡眠等待proc-gt;wait...
  10. 使用WebDriver 登录163邮箱
  11. 算法岗面经总结(新华智云-北京)
  12. 解决ERROR Failed to compile with 3 errors These dependencies were not found: * pdfjs-dist/es5/buil问题
  13. docker 分析cpu占用过高
  14. 豆瓣8.0分,尺度堪比色戒,一部让人绝望的电影
  15. 英语中的分数 带分数 小数怎么读
  16. 为什么蘑菇丁会显示服务器繁忙,浅谈蘑菇丁自动打卡
  17. 2022-2028年全球与中国运动钓鱼用具行业市场需求预测分析
  18. 应用权限不足0xc0000022
  19. 刷网站关键字_学霸都在偷偷使用的 6 个高质量自学网站
  20. 图解HTTP-阅读笔记

热门文章

  1. SQLite数据库【转有改】
  2. 智器SmartQ T7实体店试用体验
  3. 网管实战之使用RSA实现企业安全访问
  4. 飞鸽传书,,尼玛察部,大地一片生机
  5. 飞秋_常用正则表达式集锦
  6. VBSCRIPT的循环挺好理解的
  7. 《人民邮电出版社9本计算机教材的教学课件(计算机老师的宝贝)》
  8. 一个黑客和一个电脑白痴的对话
  9. 第十一节:JavaScript有了一种全新的数据类型:Symbol
  10. sklearn.model_selection中train_test_split的坑