【Git】原理及使用(二) (版本回退)

版本回退

之前我们也提到过,Git能够管理文件的历史版本,这也是版本控制器重要的能力。如果有一天你发现之前的工作出现了很大问题,需要在某个特定的历史版本重新开始,这个时候就需要版本回退功能了。

执行 git reset 命令用于回退版本,可以指定退回某一次提交的版本。要解释一下 "回退" 本质是要将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定:

复制代码
git reset 命令语法格式: git reset [--soft | --mixed | --hard] [HEAD]
--soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
--mixed 为默认选项,使用时可以不用带该参数。
该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。
--hard 参数将暂存区与工作区都退回到指定版本。
切记工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前一定要慎重。

HEAD说明:

复制代码
可直接写成 commit id,表示指定退回的版本
◦ HEAD 表示当前版本
◦ HEAD^ 上一个版本
◦ HEAD^^ 上上一个版本
◦ 以此类推...
可以使用〜数字表示:
◦ HEAD~0 表示当前版本
◦ HEAD~1 上一个版本
◦ HEAD~2 上上一个版本
◦ 以此类推...

测试回退功能:

回退到version2,重新基于version2开始编写。由于我们在这里希望的是将工作区的内容也回退到version2版本,所以需要用到--hard参数:

如果我后悔了,想再回到version3怎么办?我们可以继续使用git reset命令,回退到version3版本,但我们必须要拿到version3的commit id去指定回退的版本。

但我们看到了git log并不能打印出version3的commit id,运气好的话我们可以从终端上去找找之前的记录,运气不好的话commit id已经被我们搞丢了。

Git还提供了一个git reflog命令能补救一下,该命令用来记录本地的每一次命令。

Git的版本回退速度非常快,因为Git在内部有个指向当前分支(此处是master)的HEAD指针,refs/heads/master文件里保存当前master分支的最新commit id。当我们在回退版本的时候,Git仅仅是给refs/heads/master中存储一个特定的version,可以简单理解成如下示意图:

撤销修改

我们在⼯作区写了很⻓时间代码,想恢复到

上⼀个版本:

情况一:工作区的代码,还没有add

我们可以使用 git checkout -- file 命令让工作区的文件回到最近一次 add 或 commit 时的状态。要注意 git checkout -- file 命令中的 -- 很重要,切记不要省略,一旦省略,该命令就变为其他意思了。

情况二:已经add,但还没commit

git reset 回退命令如果使⽤--mixed 参数,可以将暂存区的内容退回为指定的版本内容,但⼯作区⽂件保持不变。那我们就可以回退下暂存区的内容了。

情况三:已经add,并且也commit了

可以 git reset --hard HEAD^ 回退到上⼀个版本。不过,这是有条件的,就是你还没有把⾃⼰的本地版本库推送到远程。

删除文件

在Git中,删除也是⼀个修改操作。如果要删除 f3⽂件,怎么搞呢?如果你这样做了:

但这样直接删除是没有⽤的,git status 命令会⽴刻告诉你哪些⽂件被删除了:

此时,工作区和版本库就不一致了,要删文件,目前除了要删工作区的文件,还要清除版本库的文件。

走到这里,一般有两种可能:

复制代码
1.不小心删错了
2.确实要从版本库中删除文件

第一种误删操作:需要用git进行恢复

对于第一种情况,很明显是没有删完,我们只删除了工作区的文件。这时就需要使用git rm 将文件从暂存区和工作区中删除,并且commit :

现在,⽂件就从版本库中被删除了。

注意:

git rm f3 做了两件事:

1.从工作区删除 f3 文件

  1. 自动把"删除 f3"这件事加入暂存区
相关推荐
恒5392 小时前
Linux文件系统I
linux·运维·服务器
阿成学长_Cain2 小时前
Linux ipcs 命令超全详解:查看共享内存 / 消息队列 / 信号量,IPC 运维必备
linux·运维·服务器·网络·数据库
黯然神伤8882 小时前
AlmaLinux设置软件下载源
linux·alma
青瓦梦滋3 小时前
协议定制/序列化-反序列化(Linux视角)
linux·服务器·网络·c++
阿成学长_Cain6 小时前
Linux dirs命令详解|Bash目录堆栈管理快速切换目录实战教程
linux·运维·前端·数据库
ICECREAM7 小时前
Linux 进程间通讯(IPC)——总结
linux
想你依然心痛8 小时前
嵌入式Linux安全加固:SELinux、Capabilities与Seccomp——强制访问控制与沙箱
linux·运维·安全
REDcker9 小时前
macOS 挂载 Linux 远程目录详解
linux·运维·macos
2601_961593429 小时前
Mac 上搭建Linux环境吗?VMware + CentOS Stream 9 镜像快速部署
linux·运维·ide·macos·centos
dddwjzx9 小时前
嵌入式Linux C应用编程入门——线程 (二)
linux·嵌入式