git-版本回滚-git revert【删除提交】
1、场景简介
git reset的方法很好,可以实现代码的操作撤销的动作,reset撤销动作一旦执行后,原来的历史记录就没有了,但是我们知道人是会犯错的,肯定会出现不小心想错了,做了不该撤销的撤销,这个时候我们只能重新
再来做一遍了,而这一次重写不一定能完全顺利,所以有没有一种撤销不但能实现撤销的效果,还能留住之前的commit历史记录呢? revert 可以考虑一下。
2、原理解析
2.1、原理图
2.2、原理说明
git revert的提交流程跟git commit一样,但是他们提交的内容是完全相反的。
revert执行前: 最初版本经过commit +a.txt 后到达A版本,经过commit +b.txt 后到达B版本,在经过commit +c.txt 后到达C版本
revert执行后: C版本经过commit -a.txt后到达D版本,正好是commit A版本的逆过程
注意: revert操作后版本会递增(D),不影响之前提交的内容(B+C),只不过撤销版本(A)的内容删除罢了 revert VS reset git revert不像git checkout|reset可以用于文件和commit对象,它只能作用于commit对象。 revert用于撤销已committed的变化,reset用于撤销uncommitted changes
2.3、revert命令解析
命令格式:git revert <commited_id|HEAD>
注意:revert 有一个参数 --abort 用于撤销该次回滚
3、revert实践
3.1、准备工作
# 在一个初始环境中,进行三次正常的代码提交 mkdir /data/revert && cd /data/revert git init echo first > a.txt; git add a.txt; git commit -m "A" echo second > b.txt; git add b.txt; git commit -m "B" echo three > c.txt; git add c.txt; git commit -m "C" # git log --pretty=format:"%h - %an, %ar : %s" --graph * 7fd391d - 277667028@qq.com, 2 minutes ago : C * 4ea31f7 - 277667028@qq.com, 2 minutes ago : B * 3f8c2d2 - 277667028@qq.com, 2 minutes ago : A
3.2、实践
# 我想撤销B版本的修改(A版本增加b.txt后变成B版本的) ,效果:会把B版本相关的文件删除,重新编写。 git revert 4ea31f7 git status git log --all --graph --oneline 注意: 在执行revert命令的时候,不要在暂存区有内容,因为revert只针对commited内容,否则的话会报错 error: your local changes would be overwritten by revert. hint: commit your changes or stash them to proceed. fatal: revert failed # 日志效果 ]# git log --all --graph --oneline * 50b35bd (HEAD -> master) Revert "B" * 7fd391d C * 4ea31f7 B * 3f8c2d2 A # ll drwxr-xr-x 8 root root 4096 Jun 11 04:35 .git/ -rw-r--r-- 1 root root 6 Jun 11 04:31 a.txt -rw-r--r-- 1 root root 6 Jun 11 04:31 c.txt