git revert 与 git reset
Git版本回滚之 git revert 与 git reset
在使用 git 的时候,如果错误push之后,经常会回滚版本。
git的回滚有两种方式:
revert命令:这种方式,是用一种反向的 push 来重新提交一次。git中可以看到操作记录。
reset命令:这个命令,是一种重置。即错误提交了,我要删除这个提交记录。也可以实现回滚。
两个命令的对比:
revert 和 reset 看上去达到的效果是一样的,但其实是完全不同的过程。
如果已经 push 到线上代码库, reset 删除指定 commit 以后,再 git push 可能导致一大堆的冲突。但是 revert 并不会。
如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里。但是 revert 反向提交的commit 并不会出现在历史分支里。
reset 是在正常的 commit 历史中,删除了指定的 commit,这时 HEAD 是向后移动了,而 revert 是在正常的 commit 历史中再 commit 一次,只不过是反向提交,他的 HEAD 是一直向前的。
git reset 常用参数的理解

从上面这张图,可以直观的了解 git 的工作流程。
- 最初的状态是我们正在书写代码,这个状态对应图中的 Working diretory。这个时刻,我们的代码是独立的,跟 git 没有一点关系。
- 随后,我们把当前编辑的
A文件add到 git 中,这个时候就跟 git 发生了关系,git 接收了我们的代码。然后把这个文件存入了自己的暂存区 stage ,后面我们对这个文件的任何更改 ,git 都会知晓。这个状态对应图中的 Stage/Index。 - 我们把写好的
A文件commit到 git ,这就有了一次提交历史,对应图中的 History。在 git 中只要commit过的文件,都有各种方式可以恢复,基本来说,就是不会丢了。
随着项目的进行,我们发现代码写的不好,需要回退到上一次的提交,我们有几个命令可以选择。
常见以下三个命令:
git reset --hardgit reset --softgit reset --mixed
git reset --hard
这个命令非常危险 ,是 git 中少有的几个会丢失信息的操作。它会把回退点之前的所有信息都删掉,一个不留,干干净净。
举个例子:
现在我把 A 文件修改了两次,到了 C 状态 ,并且已提交。
那么我的分支指针是指向 C , 当前文件编辑的状态也是在 C
(F)
A-B-C
↑
master
我输入了git reset --hard,结果会变成:
(F)
A-B
↑
master
对的, C 状态彻底没有,再也找不回来。所以,没事不要用这个命令。
git reset --soft
同样是这个状态:
(F)
A-B-C
↑
master
我输入了git reset --soft,结果是:
(F)
A-B-C
↑
master
文件状态与分支的指针都指向上一个提交,C 还是在的,只是没显示。
git reset --mixed
仍然是这个场景:
(F)
A-B-C
↑
master
我输入了 git reset --mixed,结果是:
(F)
A-B-C
↑
master
分支指针指向上次提交点,但是文件状态还是在当前文件 C ,我看到的现象就是 C 文件还在,但是没有 add ,是红色的。
可以看出,三个命令中 mixed 是最好的回退处理方式,其实这也是 git reset 的默认参数。
git revert 与 git reset的更多相关文章
- git revert 和 git reset的区别
git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一次最新的提交 * git revert HEAD ...
- git的几种回滚 git revert 和 git reset的区别
git的几种回滚 git revert 和 git reset的区别:强烈建议:对HEAD不熟的话最好不要用HEAD,直接用commitID吧,我遇到的问题:reset HEAD~1之后,可能是别人提 ...
- git revert和git reset的区别
git revert 是撤销某次操作,此次操作之前的commit都会被保留 git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区 具体一个例子,假设有三个commit, git s ...
- git revert .vs. git reset .vs. git rebase
1. git rervert的工作方式是:将一个老的commit的改动完全找出来,并且在新的tip处运行反操作,最终清除老commit的改动: git revert的应用场景多在对public rep ...
- 详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别
http://josh-persistence.iteye.com/blog/2215214
- git revert用法以及与git reset的区别
git revert用法 git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一次最新的提交 * git revert HEAD ...
- git reset与git revert的区别
http://alpha-blog.wanglianghome.org/2010/07/30/git-partial-rollback/ reset(版本撤回) 格式 git reset [-q] [ ...
- git reset与git revert比較
git reset git reset的作用是还原Index的状态或改动本地分支HEAD的位置. 这个命令适合用于从某个提交点又一次开新的分支.比方,假设某个提交之后的代码我们都不要了,就能够在本地r ...
- git reset --hard和git revert命令
git reset --hard和git revert命令 git误操作时可以用git reset –hard 去撤销这次修改, 但是这样做也有问题,可能在之前本地有没有提交的修改也都消失了, ...
随机推荐
- 使用java原生API模拟请求下载文件
/** * * @param urlPath * 下载路径 * @param saveDir * 下载存放目录 * @return 返回下载文件 * @throws Exception */ publ ...
- Oracle中按规定的字符截取字符串
CREATE OR REPLACE FUNCTION "F_SPLIT" (p_str IN CLOB, p_delimiter IN VARCHAR2) RETURN ty_st ...
- 如何在 Mac 上卸载 Java?
使用终端卸载 Oracle Java 注:要卸载 Java,您必须具有管理员权限,并且必须以 root 用户身份或者使用 sudo 工具来执行删除命令. 按照下面所示,删除一个目录和一个文件(符号链接 ...
- android软件开发之获取本地音乐属性
歌曲的名称 :MediaStore.Audio.Media.TITLString tilte = cursor.getString(cursor.getColumnIndexOrThrow(Media ...
- 竞赛题解 - NOIP2018 旅行
\(\mathcal {NOIP2018} 旅行 - 竞赛题解\) 坑还得一层一层的填 填到Day2T1了 洛谷 P5022 题目 (以下copy自洛谷,有删减/修改 (●ˇ∀ˇ●)) 题目描述 小 ...
- Tornado异步与延迟任务
最近一直在研究Tornado异步操作,然而一番研究后发现要使一个函数异步化的最好方法就是采用相关异步库,但目前很多功能强大的库都不在此列.经过一番查找文档和搜索示范,终于发现了ThreadPoolEx ...
- PHP二维码生成
原文链接:http://www.qqdeveloper.com/detail/14/1.html 代码下载地址:链接:http://pan.baidu.com/s/1dFgqiaP 密码:lex5 材 ...
- 分布式缓存 Redis(一)
概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括string( ...
- mysql 导出行数据到txt文件,指定字符分割
select id,name, concat('tel:',phone) from user order by time INTO outfile 'user.txt' FIELDS terminat ...
- Delphi采用接口实现DLL调用
Delphi使用模块化开发,可以采用DLL或者BPL,两者的区别是BPL只能被同版本的Delphi使用,DLL可以被不同版本和不同开发工具的开发的软件调用. 因此我们的软件大多使用Delphi作为界面 ...