git的版本回退探索

简介

今天改完代码匆忙提交,上线发现有问题,那怎么办?废话,赶紧回滚,那怎么回滚,开始用git reset [--soft | --mixed | --hard 命令,但这命令真的能达到我预期的效果吗? 每个参数后面的意思又是什么?让人一头雾水,然后用了 reset  --hard命令,并没有达到预期的效果。现在总结下

1、git相关术语

  • HEAD

这是当前分支版本顶端的别名,也就是在当前分支你最近的一个提交

  • Index

index也被称为staging area,是指一整套即将被下一个提交的文件集合。他也是将成为HEAD的父亲的那个commit

  • Working Area

   working Area代表你正在工作的那个文件集

1、没有push

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

reset
git reset [--soft | --mixed | --hard

  # --soft # 只还原 HEAD
  # --mixed # 还原 HEAD、Index # 默认参数
  # --hard # 还原 HEAD、Index、Working Directory

2、已经push

git revert HEAD                  #撤销前一次 commit
git revert HEAD^                 #撤销前前一次 commit
git revert commitId              #(比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。

git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,

版本会递增,不影响之前提交的内容

git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销
作为一次最新的提交

2.1、example

假设按时间顺序依次有commit1, commit2, commit3,commit4,对应有version1, version2, version3, version4四个状态。现在你push了version4线上有问题,想要回退到version3状态,只需要 执行

git revert HEAD 

注意:这样线上的代码还是不会变,但是本地的代码状态回到了 version3,你再commit5,push到线上,这样线上的代码就跟version3一样了。

 3、reset和revert对比

  看到这里细心的读者会觉得,为什么push之后,reset就不能回滚,git reset --hard commitId也能改变本地工作区,再commit,和push一次,线上的代码不就改变了吗?博主自测的情况是不行。

你用git reset --hard commitId 本地的代码虽然回退了,跟线上代码不同了,但是local Changes并没出现跟线上代码不同的文件,这时候在terminal中,用命令提交,如下:

一样是失败,提示你在push 之前,先git pull ,但是你 git  pull,线下错误代码又恢复了,所以push之后的想回滚,用git revert

参考:http://blog.csdn.net/secretx/article/details/51461972

原文地址:https://www.cnblogs.com/520playboy/p/7474452.html