Git 版本回退与撤销修改

作为版本控制管理器,Git应当具备版本回退等一系列功能------它的应用场景也很常见,当你在工作区开发时,忽然发现:怎么我这版本写的代码还不如上一版本好?这时,版本回退功能就派上用场了。

一.版本回退

1.概览

首先我们先明确版本回退的指令

git reset --soft|--mixed|--hard HEAD

我们来一一解释这几个选项对应的作用。

|-----------|-----------|-----------|-----|---------|
| ReadMe | 工作区 | 暂存区 | 版本库 | 选项 |
| git world | git world | git world | git | --soft |
| | git world | git | git | --mixed |
| | git | git | git | --hard |

1.--soft:仅回退版本库的内容

2.--mixed:回退暂存区和版本库内容,是默认选项

3.--hard:将所有区域内容全部回退,有可能会覆盖当前工作区的内容,建议谨慎使用。

2.回退工作流

1.git log------查看日志。若要执行回退,首先要明确回退到哪个版本。

bash 复制代码
wujiahao@VM-12-14-ubuntu:~/gitcode$ git log --pretty=oneline
18812885f304b7ba2baa67a109a2762ebb6f85c3 (HEAD -> master) add some files
f5aa7498c931ae9bc6cf0edfa400f7ceb28816a9 add first word

2.git reset ------执行回退,选项后面跟上commitID即可。例如这里回退到 add some files。

bash 复制代码
wujiahao@VM-12-14-ubuntu:~/gitcode$ git reset --hard 18812885f304b7ba2baa67a109a2762ebb6f85c3
HEAD is now at 1881288 add some files

#现在的效果
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

3.git reflog------如果后悔回退怎么办?可以查找本地所有reset操作的日志,回退到其他想要的版本(继续执行git reset即可)

bash 复制代码
wujiahao@VM-12-14-ubuntu:~/gitcode$ git reflog
1881288 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
d6a7559 HEAD@{1}: commit: Modify ReadMe Third
1881288 (HEAD -> master) HEAD@{2}: reset: moving to 18812885f304b7ba2baa67a109a2762ebb6f85c3
1881288 (HEAD -> master) HEAD@{3}: commit: add some files
f5aa749 HEAD@{4}: commit (initial): add first word

3.回退的原理

我们在执行版本回退时,会发现其执行速度非常快。那么它的原理是什么呢?

根据commitID直接修改HEAD指针指向的git对象

二.撤销修改

1.概览

撤销修改的情况可以大概分为以下几类:

|-----------------------------|-----------------------------------------------------------------------------------|
| 情况 | 执行操作 |
| 仅修改工作区 | git checkout -- filename |
| 执行了add,但没有commit到版本库 | 1.git reset --hard filename 2.git reset --mixed filename git checkout -- filename |
| 已经commit到版本库,但没有执行push到远程仓库 | git reset --hard |

接下来一一进行详解。

2.详解

1.仅修改工作区

例如这里我们对ReadMe写入xxx code

bash 复制代码
wujiahao@VM-12-14-ubuntu:~/gitcode$ vim ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
xxx code

怎样回退到之前的版本?我们当然可以选择用vim编辑器等修改,但是修改的部分越多越复杂,这种方法越不实用。因此我们使用以下方法:

git checkout -- filename

bash 复制代码
wujiahao@VM-12-14-ubuntu:~/gitcode$ git checkout -- ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

2.执行了add,但没有commit到版本库

我们写入this is the second change并执行add

bash 复制代码
wujiahao@VM-12-14-ubuntu:~/gitcode$ vim ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
this is the second change
wujiahao@VM-12-14-ubuntu:~/gitcode$ git add ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   ReadMe

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	file5

git status

查看当前git状态,发现暂存区有文件被修改(ReadMe)

首先这里有两种解决办法,一种直接reset --hard,另一种是reset --mixed(默认选项),默认回退版本库和暂存区,相当于回到了第一种情况。在这里介绍第二种用法

bash 复制代码
wujiahao@VM-12-14-ubuntu:~/gitcode$ git reset HEAD ReadMe
Unstaged changes after reset:
M	ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   ReadMe

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	file5

no changes added to commit (use "git add" and/or "git commit -a")

然后再使用和情况1的指令即可

bash 复制代码
wujiahao@VM-12-14-ubuntu:~/gitcode$ git checkout -- ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	file5

nothing added to commit but untracked files present (use "git add" to track)
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

3.已经commit到版本库,但没有执行push到远程仓库

我们加入 this is the third change,并且add和commit

bash 复制代码
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
wujiahao@VM-12-14-ubuntu:~/gitcode$ vim ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
this is the third change
wujiahao@VM-12-14-ubuntu:~/gitcode$ git add ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git commit -m "Modify ReadMe Third "
[master d6a7559] Modify ReadMe Third
 1 file changed, 1 insertion(+)

只需要用reset的hard选项即可,HEAD表示当前版本,那么上个版本就是HEAD^

bash 复制代码
wujiahao@VM-12-14-ubuntu:~/gitcode$ git reset --hard HEAD^
HEAD is now at 1881288 add some files
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	file5

nothing added to commit but untracked files present (use "git add" to track)
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
相关推荐
EasyGBS4 小时前
摄像头还在线,画面已经不能用了?国标GB28181视频平台EasyGBS视频质量诊断怎么用
服务器·安全·音视频
Cc.Y4 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
阿森_dev4 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
mister_guo4 小时前
开发指南:Git日常维护与常用命令
git
by209994 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说4 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha4 小时前
Lambda 表达式和函数式接口
java·开发语言
小白学大数据4 小时前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构
迪康Defender5 小时前
终端安全审批体系设计:如何平衡安全管控与业务连续性
运维·服务器·安全·运维开发·学习方法·业界资讯·远程工作
学逆向的5 小时前
win32注入代码
开发语言·网络安全·api·win32