git revert 与 git reset

摘要:
Git版本回滚。当使用git时,git版本通常在推送错误后回滚。两个命令的比较:reverse和reset似乎达到了相同的效果,但实际上,它们是完全不同的过程。但是,反向提交不会出现在历史分支中。以下三个命令是常见的:gitset--hardgitset--softgitset--mixedgitset--hard这个命令非常危险。这是git中为数不多的会丢失信息的操作之一。可以看出,mixed是三个命令中最好的回退处理方法。事实上,它也是giteset的默认参数。

Git版本回滚之 git revert 与 git reset

在使用 git 的时候,如果错误push之后,经常会回滚版本。 

git的回滚有两种方式:

  • revert命令:这种方式,是用一种反向的 push 来重新提交一次。git中可以看到操作记录。

  • reset命令:这个命令,是一种重置。即错误提交了,我要删除这个提交记录。也可以实现回滚。

两个命令的对比:

revert 和 reset 看上去达到的效果是一样的,但其实是完全不同的过程。 

  1. 如果已经 push 到线上代码库, reset 删除指定 commit 以后,再 git push 可能导致一大堆的冲突。但是 revert 并不会。 

  2. 如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里。但是 revert 反向提交的commit 并不会出现在历史分支里。 

  3. reset 是在正常的 commit 历史中,删除了指定的 commit,这时 HEAD 是向后移动了,而 revert 是在正常的 commit 历史中再 commit 一次,只不过是反向提交,他的 HEAD 是一直向前的。

git reset 常用参数的理解

git revert 与 git reset第1张

从上面这张图,可以直观的了解 git 的工作流程。

  • 最初的状态是我们正在书写代码,这个状态对应图中的 Working diretory。这个时刻,我们的代码是独立的,跟 git 没有一点关系。
  • 随后,我们把当前编辑的 A 文件 add 到 git 中,这个时候就跟 git 发生了关系,git 接收了我们的代码。然后把这个文件存入了自己的暂存区 stage ,后面我们对这个文件的任何更改 ,git 都会知晓。这个状态对应图中的 Stage/Index。
  • 我们把写好的 A 文件 commit 到 git ,这就有了一次提交历史,对应图中的 History。在 git 中只要 commit 过的文件,都有各种方式可以恢复,基本来说,就是不会丢了。

随着项目的进行,我们发现代码写的不好,需要回退到上一次的提交,我们有几个命令可以选择。

常见以下三个命令:

  • git reset --hard
  • git reset --soft
  • git 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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇简便的将DataSet导入到数据库中大型php网站性能和并发访问优化方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

centos7下安装composer和git

一、安装composer composer 属于php的包依赖管理工具。 1、进入Composer国内镜像网站文档页查看安装方法: https://docs.phpcomposer.com/00-intro.html 2、在centOS系统中进入特定目录执行以下命令: cd /usr/local/composer curl -sS https://get...

Git安装及使用

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 一、安装Git(Git-2.19.1-64-bit.exe) 下载git for windows客户端http://msysgit.github.io/ 安装过程没什么特别的,不停next就ok了。 二、安装tortoise git(TortoiseGit-2.7.0.0-64b...

Gitlab日常备份和恢复

按照官方安装文档安装完成之后的/home/git目录结构如下,这里我大致翻译官方的内容,部分加上自己的话,英语功力捉急,请见谅 |-- home | |-- git | |-- .ssh | |-- gitlab | |-- gitlab-satellites | |-- gitlab-shell | |-- repositories * `/home/g...

SVN 向 GIT 进行转换如何拉取指定版本后的提交

很多时候,我们不需要拉取所有的内容,我们可以拉取指定版本后的内容。 你可用使用参数:-r8000:HEAD 例如使用下面的命令: git svn clone https://svn.code.sf.net/p/docutils/code/trunk docutils -r8000:HEAD 可以拉取 8000 版本以后的提交记录。 对于一些项目...

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十九:LCD模块

实验二十九:LCD模块 据说Alinx 301支持 7”TFT,好奇的朋友一定疑惑道,它们3.2”TFT以及7”TFT等两者之间究竟有何区别呢?答案很简单,前者自带控制器也有图像内存。换之,后者好似缩小版台式的液晶,它除了接口以外什么也没有。 图29.1 7”TFT的引脚。 如图29.1所示,这只7“TFT拥有840 * 480的分辨率,应用VGA接口,...

解决用官方容器启动redmine无法插入中文字符的问题

   jiangzhaowei@kitking:/kitking/redmineIot$ sudo docker-compose up -d Creating network "redmineiot_default" with the default driver Creating redmineiot_mysql_1 ... Creating r...