git revert/reset --hard/soft 区别理解

总有一天你会遇到下面的问题.

(1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚.

(2)改完代码测试也没有问题,但是上线发现你的修改影响了之前运行正常的代码报错,必须回滚.

这些开发中很常见的问题,所以git的取消提交,回退甚至返回上一版本都是特别重要的。

大致分为下面2种情况:

1.没有push

这种情况发生在你的本地代码仓库,可能你add ,commit 以后发现代码有点问题,准备取消提交,用到下面命令
git reset [ --soft | --mixed | --hard ]

--mixed

会保留源码,只是将git commit和index 信息回退到了某个版本.

git reset 默认是 --mixed 模式
git reset --mixed 等价于 git reset

--soft

保留源码,只回退到commit 信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.

image.png

--hard

源码也会回退到某个版本,commit和index 都回回退到某个版本,此版本之后所有提交历史全都被清空(注意,这种方式是改变本地代码仓库源码)

image.png
image.png

当然有人在push代码以后,也使用 reset --hard <commit...> 回退代码到某个版本之前,但是这样会有一个问题,你线上的代码没有变,线上commit,index都没有变,当你把本地代码修改完提交的时候你会发现全是冲突,所以这种情况你要使用下面的方式:

2.已经push

对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致,你要用到下面的命令
git revert
git revert用于反转提交,执行命令时要求工作树必须是干净的.
revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题)
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
看似达到的效果是一样的,其实完全不同.

  1. 上面我们说的如果你已经push到线上代码库, reset 删除指定commit以后,你git push可能导致一大堆冲突.但是revert 并不会.
  2. 如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里.
  3. reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的.
image.png
image.png

本文参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,615评论 1 26
  • 家装演变的三个时代,作为一个家装人,你又知道多少呢?跟随小窝一起来了解一下。 工业时代的技术发展是机械性的,但互联...
    乌拉墨菲阅读 451评论 0 8
  • 今天是南京大屠杀纪念日,阴沉的天气也似乎在默哀当年的惨剧。我在南京读完了大学四年,在南京,我深刻的感受到这段被赋予...
    雨系阅读 425评论 0 3
  • 有位伟大的哲人说过:这世间唯美食与美景不可辜负,这话诚然不假,不过我要说的是:饿了的时候不要自己做饭,之前有...
    nocaspe阅读 443评论 0 0
  • 这是我公众号多维世界观的第二篇。 上一篇结尾说:我们要不断地突破自己,实现无边界。 这就需要我们具备一种思维方式—...
    多维世界观阅读 2,156评论 0 2