文章目录

  • 前言
  • 一、版本回退 (撤销commit修改)
    • 版本查看
    • 临近版本回退
    • 指定版本回退
    • git reset的模式
  • 二、修改撤销
    • 在工作区的修改撤销(撤销直接修改)
    • 在暂存区的修改撤销(撤销add修改)
    • 在版本库的修改撤销(撤销commit修改)
  • 总结

前言

之前转载过一篇博文介绍了Git的三大分区,正是有这三大分区的存在,给Git操作创造了更多灵活性的空间,赋予了Git操作的“后悔药”。

本文针对Git操作中的版本回退和修改撤销进行一些介绍和总结。


提示:以下是本篇文章正文内容,下面案例可供参考

一、版本回退 (撤销commit修改)

如上图所示,Git有一个版本库的概念。每当你觉得文件修改到一定程度的时候,就可以进行一次commit提交,此时就好像是存储了一个当前版本。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

版本查看

当我们想要回退到某一个版本的时候就需要知道我们都有哪些版本,也就是都进行了哪些commit操作。此时就要使用git log命令来查看提交历史,以便确定想要回退到那个版本去。

从上图中git log显示的提交日志可以看出进行了4次提交,相当于是有4个版本。最近一次是第三次提交,上一次是第二次提交,以此类推。如果想要输出信息更简洁,方便查看都有哪些版本,可以在git log命中后面加上--pretty=oneline参数。

注意⚠️:每行前面黄色的一大长串就是一次commit的commit id(版本号)。Git的commit id不同于SVN中的1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示

临近版本回退

知道如何查看版本后,就可以根据提交日志,确定我们要回退到那一个版本。一般情况下都是当前这个版本是想要放弃的,所以只需要回退到最近的上一个版本就好。让我们来看看如何操作。

首先这里你要知道,在Git中,用HEAD表示当前版本,也就是最新的提交。所以上一个版本就用HEAD^来表示,上上一个版本就是HEAD^^,同理类推:往前多少个版本就在HEAD上加多少个^。当然这种情况下如果是往上非常多的版本(比如100),这种写法就不太实际,可以简写成HEAD~100

# 撤销上一次的提交
git reset --soft HEAD^# 撤销输入数字n条commit记录
git reset HEAD~数字n

例如,我们把版本回退到上个版本(second time commit),就可以使用命令git reset回退:


***deMacBook-Pro GitDemo % git reset --hard HEAD^
HEAD is now at 17798fe docs:This is the second time commit

看提示信息已经成功了,看看readme.txt的具体内容:

没有了third time commit,说明版本确实回退了。

指定版本回退

回退到上一版本后我们查看提交日志:

可以看到third time commit的记录完全没有了,这时候又后悔了,还想要third time commit 的版本怎么办?之前的回退是在已有的前任版本中回退,不适用于这种向后一个版本回退(回退的回退)。这就可以使用命令git reset --hard commit_id指定到未来的某一个版本进行回退了:

***deMacBook-Pro GitDemo % git reset --hard ab8ef
HEAD is now at ab8ef0e docs: This is the third time commit

注意⚠️:版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了

查看readme.txt内容:

“third time commit”版本又回来了。

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向"third time commit"改为指向"second time commit"。然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

这里有个问题是如果不记得未来某个版本的commit idgit log也没有了记录,该怎么办?这里Git中可以使用git reflog记录每一次命令:

这样就知道未来版本的commit id了。然后就可以指定版本回退了。

这里说明一下git reflog命令得到的结果:(以第4条结果为例分析)

  1. 17798fe 是 commit 的 SHA1 值,需要特别注意,它是移动后的 commit id。
  2. HEAD@{3} 是标识这是 HEAD 指针3个移动前的指向内容(从当前往回数第4个操作),也就是上面的17798fe
  3. commit 是表示造成这个移动的原因,是进行了 commit 操作。
  4. docs:This is the second time commit 表示操作的内容,commit 操作对应的就是 commit message。

git reflog <ref> 默认的是 HEAD 指针,如果我们想查看其他的引用,换成对应的内容就可以。

 //查看 master 分支指针的移动记录git reflog master//查看 test 分支指针的移动记录git reflog test

git reset的模式

在上面的版本回退中,我们使用了git reset 命令来实现,在使用命令的时候我们加入了一个参数--hard,这其实是指定一种模式。使用git reset help命令可以看到一共有5中模式,比较常用的可以是以下三种:

  • –soft
  • –mixed(默认的模式)
  • –hard

git reset --soft 只是将HEAD引用指向指定的提交,工作区跟暂存区的内容不会改变
git reset --mixed (默认选项)将HEAD指向指定的提交,暂存区的内容随之改变,工作区内容不变
git reset --hard 将HEAD指向指定的提交,暂存区跟工作区都会改变
有兴趣的同学可以查看git使用手册自行研究一下,这里不多做说明了。

可以使用一下命令方式查看git使用手册:
$ git help <verb>
$ git <verb> --help
$ man git-<verb>

二、修改撤销

如果说版本回退是针对每一次提交来进行的话,撤销修改就是针对文件的内容来进行的。

在工作区的修改撤销(撤销直接修改)

readme.txt文件进行内容修改,然后查看git status会有类似下面的内容提示:

$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified:   readme.txtno changes added to commit (use "git add" and/or "git commit -a")

可以看到可以使用git checkout -- file丢弃工作区的修改

git checkout -- readme.txt

这里注意⚠️:如果readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;如果readme.txt已经添加到暂存区后,才作了此次修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件撤销到最近一次git commit或git add时的状态。

在暂存区的修改撤销(撤销add修改)

上面的修改撤销是在修改之后,没有进行add 和commit的操作,进行的修改撤销方式。如果某次修改之后,还git add 到暂存区了,但是还没有commit提交到版本库。可以使用命令git reset HEAD <filename>可以把暂存区的修改撤销掉(unstage),重新放回工作区:

$ git reset HEAD readme.txt
Unstaged changes after reset:
M   readme.txt

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

在版本库的修改撤销(撤销commit修改)

假设你不但改错了东西,还从暂存区提交到了版本库,这时候就可以参照上半部分版本回退的讲解,回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。


总结

对于版本回退部分:

  • HEAD指向的版本就是当前版本,所以其实可以使用命令git reset --hard commit_id实现各种版本切换。

  • git log可以查看提交历史,获得commit id等提交信息。

  • git reflog查看命令历史,可以查看所有命令操作记录。

对于修改撤销部分:

  1. 想要直接丢弃工作区的修改,用命令git checkout -- file(注意中间是“–”,且左右都有空格)
  2. 当在工作区修改了文件后还git add到了暂存区,要丢弃修改首先用git reset HEAD <file>命令丢弃修改到工作区(即第一条情况),然后按照第一条情况操作。
  3. 修改已经提交到版本库时,想要撤销修改的提交,需要进行版本回退操作(没有push到远程库)git reset --soft 需要回退到的版本号
  4. 若已经push到远程库后也想回退,就需要完成版本回退操作后,强行推送到远程仓库:
//1.版本回退
git checkout 分支名
git reset --soft 需要回退到的版本号//2.提交撤销动作到服务器,强制提交当前版本号
git push origin 分支名 --force

Git 版本回退和修改撤销相关推荐

  1. GIT版本回退和修改历史版本问题

    1:拉去或者更新代码 都需要pull代码或者同步后,才可以看到最新的日记记录 git pull(获取) = git fetch(拉取) + git merge(合并) git pull 2:git a ...

  2. Git版本回退并强制推送到远端

    Git版本回退并强制推送到远端 本文参考廖雪峰的Git教程 前言:本文章解决问题的前提是本人不小心修改了本地代码仓库的最外层目录权限,不知道原权限是什么,导致本地git提示几十个文件被修改过,实际内容 ...

  3. git版本回退简单记录

    简单记录git版本回退的命令,参考的是这篇文章1 首先查看以前存档的版本: git log 1. 知道要回退的版本和现在的版本差了多少代 回退上一代版本(1个以前) git reset –hard H ...

  4. git 版本回退 git reset --hard HEAD

    git 版本回退 git reset --hard HEAD 一不小心用git pull拉取远程仓库代码 ,把本地开发的新代码直接覆盖掉,这时想恢复本地代码要如何操作 1.进入到项目git本地仓库文件 ...

  5. Git版本回退和撤销修改

    版本回退: 在实际工作中,我们会不断对文件进行修改,然后不断提交修改到版本库里,一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失. ...

  6. git版本回退命令_Git学习版本回退和管理文件的修改及删除操作

    版本回退 前面我们成功的提交了一次mygit.txt,下面咱对它进行修改,内容如下: Hello Git Git is so easy. 然后用git status来跟踪该文件的状态: 可以看到hel ...

  7. git版本回退命令_git 版本回退 撤销 删除

    1 未使用 git add 缓存代码时(在工作区的时候) 可以使用 git checkout -- filepathname (比如: git checkout -- readme.md  ,不要忘记 ...

  8. git版本回退(git reset、git revert、git stash)

    文章目录 回退的两种情况 1.已 commit,未push到远程仓库. 1.1 git reset --soft (撤销commit) 1.2 git commit --amend(修改commit ...

  9. git版本回退:error: Your local changes to the following files would be overwritten by merge

    git pull活git push 代码出现错误,代码冲突: 解决办法: 1.解决冲突再次上传: 2.先退commit,然后再git pull,再修改代码,再上传(之所以使用这个办法,是因为编辑器一点 ...

最新文章

  1. SQL server的with的用法(一)
  2. AngularDart 现已全面采用 Dart 开发
  3. html加注算法源码,200种加密算法(源码)
  4. UCSB微软提出VIOLET,用Masked Visual-token Modeling进行端到端的视频语言学习!性能SOTA...
  5. Asp.net MVC 3实例学习之ExtShop(一)————创建应用并设置开发环境
  6. [原创]Java开发如何在线打开Word文件
  7. 在网页中加入透明flash代码
  8. 全国计算机等级考试二级教程--python语言程序设计(2018年版)第七章:数据组织的维度
  9. C语言中的半角字符,java全角、半角字符的关系以及转换详解
  10. pku 1392 Ouroboros Snake
  11. Nexmo 短信平台接口 遇到的坑
  12. 一本纯属个人的兴趣的书籍即将在未来面世
  13. Oracle创建表,id为自增序列
  14. 题解 CF940A 【Points on the line】
  15. 黑群晖安装重启后无法自动进入
  16. java 数字翻译成英文_java 英文翻译成数字
  17. 【强化学习】PPO算法求解倒立摆问题 + Pytorch代码实战
  18. 开源Star10K+数据库工具Beekeeper上手体验,免费够酷值得拥有
  19. IDEA常用操作总结(长期更新)
  20. Java菜单(菜单条、菜单和菜单项)

热门文章

  1. 虎书第五版中文翻译 2.4 向量
  2. 简单抽样技术——简单随机样本方差是总体方差的无偏估计
  3. labview学习-状态机、事件、生产者消费者模式
  4. 基于springboot的汽车租赁管理系统的设计与实现
  5. md文件转换word文档
  6. Windows如何关闭被占用的端口?
  7. 金融时间序列分析——学习金融时间序列之间的时序关系
  8. 长城内外皆vivo,什么全面屏手机这么大排场?
  9. GB4793.1试验学习(二)
  10. 阿里新一代Rank技术