![[Git-3] Git版本回退](http://pic.xiahunao.cn/yaotu/[Git-3] Git版本回退)
一、版本回退基本认识1、认识版本在Git中每执行一次git commit都会产生一个新的提交记录也就是一个新的版本。如何查看提交历史我们前面提到过gitlog每一条提交记录都会包含一些基本信息Commit ID Author Date Commit Message所谓版本回退简单来说就是将当前版本恢复或移动到之前的某个 Commit。Commit ID十分重要后面进行版本回退时可以直接指定某个Commit ID进行回退操作。除了使用Commit ID还可以使用HEAD指针进行版本回退。2、认识版本回退在使用Git的过程中错误可能发生在不同阶段工作区修改错误暂存区add的文件错误版本库commit错误已经push后发现错误以下是test.txt上传阶段的几种可能阶段工作区暂存区本地仓库远程仓库阶段一hello world阶段二hello worldhello world阶段三hello worldhello worldhello world阶段四hello worldhello worldhello worldhello world二、不同阶段回退1、回退工作区其实工作区的文件回退可以手动回退但是很可能回退错误你可能不知道改了哪些还是推荐指令回退。用暂存区的版本覆盖工作区两种方法gitrestore test.txtgitcheckout -- test.txt2、回退暂存区撤销add记录但是不会删除工作区文件gitrestore--stagedtest.txt3、修改版本库修改最近一次commit可以用git commit --amend有两种应用场景。修改提交信息描述gitcommit--amend-m新修改的提交信息补交遗漏文件gitaddlogin.hgitcommit--amend创建新的commit替换原来的最近一次提交Commit ID会变。三、多阶段回退前面讲的restore、amend都是单一阶段的回退或修改现在我们要讲解git reset指令。reset的核心作用可以理解为将当前分支移动到指定commit并根据不同模式决定是否同时修改暂存区和工作区。gitreset[--soft|--mixed|--hard]commit三种模式的区别主要在于回退范围不同–soft只回退提交位置暂存区和工作区不变。–mixed回退提交位置和暂存区工作区不变。这是默认模式。–hard提交位置、暂存区、工作区全部回退可能丢失未提交修改使用时要谨慎。commit表示要回退到的目标版本可以写Commit ID也可以使用HEAD指针的相对表示。表示当前版本 HEAD HEAD~0 表示上一个版本。 HEAD^ HEAD~1 表示上上个版本。 HEAD^^ HEAD~2 在线性的提交历史中HEAD^ 与 HEAD~1、HEAD^^ 与 HEAD~2 可以得到相同结果但遇到合并提交时^ 主要用于选择第几个父提交而 ~ 表示沿第一父提交链向前移动若干次。1、回退暂存区和工作区假设工作区修改并且已经add了gitreset HEAD test.txt以上操作不加选项默认就是 --mixed 回退版本库和暂存库不过版本库就是指定回到当前版本库所以版本库没动。暂存区就回到最近的一次commit。此时就只剩工作区没有回退直接git restore就好了。2、回退版本库、暂存区、工作区如果某次commit后发现这次提交以及对应的代码修改都不再需要可以使用gitreset--hardcommit❗️需要回退的commit尚未推送到远程仓库或者该提交历史尚未与其他人共享。3、回退错误当我们回退到早期版本发现回退得太前了此时再git log发现找不到当前版本之后的Commit ID了怎么办?可以使用如下指令gitrefloggit reflog会记录HEAD和分支最近移动过的位置因此可以帮助我们找回之前访问过的commit。可以发现简短的操作记录前面有对应的简短Commit ID4、为何回退很快如果你试着操作一下会发现Git的回退操作是很快的为什么文件很多还会这么快呢四、远程仓库回退已经push怎么撤销呢如果用reset的话可能会导致别的用户和你的记录不一样。所以用revert创建一个新的commit用反向修改抵消某个旧commit带来的变化。比如原本为23你想回到2你不能直接写为2别人可能不知道你要23-3这就是revert。gitrevertcommitgit revert 会自动完成两件事生成与目标commit相反的修改创建一个新的commit 远程仓库的介绍在后面现在了解一下即可。