By francis_hao    Nov 21,2016

从版本库初始化开始,每一步的撤销操作

添加第一个文件

在空的版本库中创建了一个文件并git add到了缓存区,这时候怎么撤销呢?

撤销单个文件和整个目录

$ git rm --cached a
$ git rm --cached . -r

首次commit内容不能撤销,不过一旦提交了一次之后,git就能发挥它强大的版本控制作用了

修改了文件

在本地修改了文件,但是还没有add操作,也就是撤销本地的修改

撤销单个文件和整个目录,"--"虽然可以省略,但还是以规范为重。表示检出文件,而不是分支

$ git checkout -- a
$ git checkout --
.

add了修改的文件

将修改的文件add到了缓存区,后悔了想撤销但本地的修改不变

撤销单个文件和整个目录

$ git reset HEAD c
$ git reset HEAD .

reset有几种模式,默认模式为mixed,也就是将版本库和缓存区里的重置,但本地文件不动。

commit了修改的文件

将修改的文件commit到版本库里了,若需要撤回到之前的版本,如下图,共有5次提交,目前在E位置,想回到C位置

$ git reset --hard C_value

这样就直接回到C位置,后面的两次提交被舍弃了。当然还可以通过git reflog查看哈希值再返回。

 

还有一种方式是,HEAD保留在E位置,但是,工作目录里的所有文件替换称C位置的。

$ git checkout C_value -- .

 

 

撤销某次提交

还是以上面的5次提交为例,发现在C提交的内容中引入了错误,需要取消C的提交,但是C之后的D和E提交需要保留。

以我的理解,git的具体做法是将B、C和E三者进行比较(至于如何比较参考下文附注),如果可以合并,git会自动合并,如果不能自动合并,就需要手动解决冲突了。

$ git revert C_value

 

 

如果有冲突,不想解决,想取消revert

$ git revert --abort

有冲突,解决了之后

$ git add <file_that_conflict>
$ git revert --continue

其中add为了让git知道冲突已经解决了,根据需要add也许是rm或mv

附注

在使用git revert时,有一个问题困扰了我很久,就是git是如何实现合并的,因为有时候觉得明明可以合并的却出现了冲突,下面以几个实验说明自己的猜想

自动合并成功举例

第一个例子是可以成功合并的,没有冲突发生,选取了B、C、D和E四个位置的文件内容。其中D位置认为没有作用。认为文件有两处差别,分别用1和2表示,1B表示第一处差别的B位置。

合并后的结果如下

根据合并后的结果推断合并过程

1B≠1C=1E    =>差别删除

2B=2C≠2E    =>差别保留

自动合并失败举例

第二例自动合并失败,提示有冲突,此处认为仅有一处差别

推断合并过程

1B≠1C≠1E    =>自动合并失败

自动合并成功-补充

本例也是和并成功的例子,和第一例不同处仅仅为1C处的修改,但并不会影响结果。是不是就可以说明D位置不会参与比较合并的过程呢?

 

 


本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/6091613.html

 

参考

[1] git help revert

[2] 廖雪峰 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 Git教程

[3] geeeeeeeeek/git-recipes https://github.com/geeeeeeeeek/git-recipes/wiki/ 代码回滚:Reset、Checkout、Revert的选择

git使用笔记(七)版本回退和撤销的更多相关文章

  1. Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突

    Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突 这篇是接着上篇分布式版本库--Windows下G ...

  2. Git版本回退和撤销修改的区别

    在阅读廖雪峰git教程时,对版本回退和暂存区撤销修改没太看懂,所以自己测试了一下. 版本回退: git reset --hard HEAD 这个命令用于版本回退,就是将已提交的版本覆盖本地工作区的内容 ...

  3. Git版本回退和撤销修改

    版本回退: 在实际工作中,我们会不断对文件进行修改,然后不断提交修改到版本库里,一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失. ...

  4. GIT入门笔记(10)- 多种撤销修改场景和对策

    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file. 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步, ...

  5. Git学习笔记三--管理修改、撤销修改、删除文件

    1.管理修改 什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改. 为什么说Git ...

  6. 【git】远程仓库版本回退方法

    1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 问题 如果提交了一个错误的版本,怎么回退版本? 如果提交了一个错误的版本到远程分支,怎么回退远程分支 ...

  7. 【Git】三、版本回退&撤消修改&文件删除

    提要 //查看git操作日志 $ git log //单行格式查看操作日志 $ git log --pretty=oneline //还原操作到上一次版本,有几个^就上几次 $ git reset - ...

  8. 『现学现忘』Git后悔药 — 27、版本回退介绍

    目录 1.什么版本回退 2.需要了解两个知识点 (1)HEAD是什么 (2)HEAD指针用法 3.git reflog命令介绍 1.什么版本回退 版本回退也可以叫回滚. 若修改过的文件,不仅添加到了暂 ...

  9. Git时光机穿梭之版本回退

    现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: Git is a distributed version control system. ...

  10. 第二课 ---git时光穿梭(版本回退)

    1.  git  status  掌握仓库当前的状态. 2.  git  diff 查看修改的内容部分. //版本回退: 1.查看更新的历史记录. git log git log --pretty=o ...

随机推荐

  1. 国内maven库链接地址,链接阿里的库,下载很快!!!

    <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http:/ ...

  2. 03 mysql补充 (进阶)

    增加字段 alter table tb1 add age int first; 增加到第一 alter table tb1 add sex int after id; # 改变位置,id是字段名字 a ...

  3. Tensorflow之MNIST的最佳实践思路总结

    Tensorflow之MNIST的最佳实践思路总结   在上两篇文章中已经总结出了深层神经网络常用方法和Tensorflow的最佳实践所需要的知识点,如果对这些基础不熟悉,可以返回去看一下.在< ...

  4. Xshell启动时显示丢失MSVCP110.dll解决方法

    成功安装xshell之后,在运行时却弹出“无法启动此程序,因为计算机中丢失MSVCP110.dll.尝试重新安装该程序以解决此问题”,很多人按照提示重装了还是出现同样的问题,本集教程将具体讲解如何处理 ...

  5. 一步一步学Linq to sql(三):增删改

    示例数据库 字段名 字段类型 允许空 字段说明 ID uniqueidentifier 表主键字段 UserName varchar(50) 留言用户名 PostTime datetime 留言时间 ...

  6. P1331 海战

    P1331 海战 题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防 ...

  7. Mac上配置Cocos2d-x开发环境(多平台:Android/iOS)

    下载以下资源: Cocos2d-x (http://www.cocos2d-x.org) Android NDK(http://developer.android.com/tools/sdk/ndk/ ...

  8. Ubuntu-C++环境设置

    在学习C++,顺便想熟悉一下Linux下开发 所以就开始搭建Linux环境 第一步就是下载虚拟机和Ubuntu 虚拟机 vm 12.1 Ubuntu 16 VM安装省略 Ubuntu安装省略 下面是我 ...

  9. 13.0 Excel表格写入

    Excel表格写入 安装 xlutils 和 xlwt Excel写入输入 分两种方式: 第一种是向一张新表之中写入..这种不多说,我几乎没怎么用,直接贴代码 import xlwt Excel_na ...

  10. zabbix从入门到精通

    第1章 zabbix监控 1.1 为什么要监控 在需要的时刻,提前提醒我们服务器出问题了 当出问题之后,可以找到问题的根源   网站/服务器 的可用性 1.1.1 网站可用性 在软件系统的高可靠性(也 ...