最近合并他人代码,因为代码是从git代码库之外来的,于是出了各种问题。于是又翻看了git教程。这里推荐两篇:
Git教程 - 廖雪峰的官方网站 非常通俗易懂,教了最基本的,十分实用。
###Git 基础图解、分支图解、全面教程、常用命令### 把git的命令以图解的形式给了出来,让人更理解git背后的处理原则。
但我读完后,仍然不理解git reset/revert,于是自己实践,终于得出了结果。
首先,说下Git的处理基准:

一、Git 基础原理

  1. 每个文件都有各自的记录,称之为树也可(这是git reset让人迷糊的地方);
  2. Git库中有commit/index/working directory 3个状态之分,如下图:

    History,所有提交过的commit保存的位置,也就是说只要commit过,都是历史,可以回到过去~
    Stage(index),也就是当前git add过的但尚未commit的文件
    Work directory,就是当前正在改的代码了
  3. Git之中并无分支,但4个指针(很像C/C++语言的指针):
    (1)我们常用的branch(像master/dev/…)
    (2)动态的HEAD,也就是当前用户在Git树中的位置,这个名称是固定的,三个命令的工作就是让这个HEAD来回走;
    (3)index指针;
    (4)work directory指针。
  4. git commit 的本质是让index/work directory/HEAD指向同一个commit。
  5. Git 不会主动删除 任何一个commit,无论这个commit是否在某个分支的路径中,或者HEAD是否指向它,所以理论上无论任何时候,只要知道commit-id就可以到达这个commit。

二、命令比较

2.1 Git 测试树

现在说完基础知识,在建一个测试环境,Git树如下:

$ git log --all --graph --oneline # 查看Git树信息

master下有dev和other两个分支,我们的测试主要在dev分支下,不用考虑other分支。dev分支下有个log.txt文件,文件内容和当前的commit内容相同

2.2 git revert 命令

现在先来说revert

$ git reset 2e5e386               # 也就是取消dev2这个commit
重置后取消暂存的变更:
M       log.txt
$ cat log.txt
<<<<<<< HEAD
dev4
=======
dev
>>>>>>> parent of 2e5e386... dev2
$ echo "revert dev2" > log.txt
$ git add .
$ git revert --continue           # revert的话,最好用这个来提交

完成后,Git树状态如下:

也就是说,git revert “commit-id”后,git 会比较”commit-id”与当前(也就是HEAD)内容的区别,由用户修改完成后,再提交为新的commit。这个命令最好让人理解。

2.3 git reset 命令

这个命令是这三个命令中最让人迷糊的,有3个参数soft/mixed(默认)/hard。只要把这3个命令和Git的3个工作区对比就可以了。
先用图说明下:
soft 参数

mixed 参数

hard 参数

配合第一节说的Git基础原理,基本就可以明白git reset 在做什么了。

但还有一个问题,如果reset当前分支好几步的commit节点,如何处理?
答:Git取变化的文件树中最新的内容。

有点迷糊啊,那来个例子:
继续之前的Git log。
先测试 soft 模式

$ git reset --soft 2e5e386
$ git status
位于分支 dev
要提交的变更:                   # !!! 这是add 过的状态  !!!(使用 "git reset HEAD <文件>..." 以取消暂存)修改:     log.txt
$ git checkout -- log.txt
$ cat log.txt
revert dev4                   # 这是log.txt文件树中最新的内容,HEAD指向了"dev2"

再测试 mixed 模式

$ git reset --hard 8785cbf    # 回到revert的位置
$ git reset 2e5e386           # 使用mixed模式到"dev2"
$ git status
位于分支 dev
尚未暂存以备提交的变更:          # !!! 这是需要 add 过的状态  !!!(使用 "git add <文件>..." 更新要提交的内容)(使用 "git checkout -- <文件>..." 丢弃工作区的改动)修改:     log.txt
$ cat log.txt
revert dev4                   # 这是log.txt文件树中最新的内容,HEAD指向了"dev2"

最后测试 hard 模式 (很危险,会清除work directory未保存的内容,最好commit后再使用这个模式)

$ git reset --hard 8785cbf    # 回到revert的位置
$ git reset --hard 2e5e386
$ git status
位于分支 dev
无文件要提交,干净的工作区

需要说明的是,git reset后,再commit时,新的commit并不在当前分支中,因为它确实不是一个有名字的分支,这时状态是detached HEAD,如下图。

想要保存,就在这时

$ git checkout -b new-branch-name

2.4 git rebase 命令

这个命令很好理解,就是不想合并分支时,把某个分支的commit自动添加到另一个分支之后,用下图可以比较清楚地解释这个命令。

git reset revert rebase 区别相关推荐

  1. Git reset , revert, checkout的区别和联系

    转自: http://www.cnblogs.com/houpeiyong/p/5890748.html 拿来做个笔记 git reset.git checkout和git revert是你的Git工 ...

  2. git reset revert 回退回滚取消提交返回上一版本

    总有一天你会遇到下面的问题. (1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚. (2)改完代码测试也没有问题,但是上线发现你的修改影响了之前运行正常的代码报错,必须回滚. 这些开发中很常见 ...

  3. git checkout和git reset的一些区别以及配置git简写命令

    一.背景 在调试代码的时候,每次都要通过git上传到服务器调试,实在是一件很麻烦的事情.所以对于一些微小的改动,我就直接在服务器上修改.等调试成功之后,用git reset再回退到之前的版本,后来经过 ...

  4. git reset --hard、git reset --sort及git revert区别

    一. 在git操作中,有时候,进行了错误的提交,但是还没有push到远程分支,想要撤销本次提交,可以使用git reset –-soft/hard命令. 1.二者区别: git reset –-sof ...

  5. Git复习(十三)之git revert用法及与git reset区别

    git revert用法以及与git reset的区别 git revert用法 git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一 ...

  6. git如何查看缓存区文件内容_详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别...

    一.可以将git简单的分为三个区域   1.工作区(working directory)    2.暂缓区(stage index)    3.历史记录区(history)    如图: 其中git ...

  7. Git Rebase vs Merge, GIt Reset vs Revert

    Git merge vs Rebase 构造场景如下: https://zhuanlan.zhihu.com/p/29682134?utm_source=wechat_session Git Rest ...

  8. git-代码撤销、回滚到任意版本(git回滚命令reset、revert的区别)

    文章目录 一.Git 代码撤销.回滚到任意版本(当误提代码到本地或master分支时) 二.git回滚命令reset.revert的区别 1. 背景知识 2. 方法一:git reset(回退) 3. ...

  9. git reset --hard HEAD与git revert HEAD区别(简单明了!)

    一.reset reset命令把当前分支指向另一个位置,并且相应的变动工作区和暂存区. 二.revert git revert用一个新提交来消除一个历史提交所做的任何修改. git revert 撤销 ...

最新文章

  1. MySQLdb的安装
  2. java access 分页查询语句,爱不释手—几条常见的数据库分页之SQL语句代码
  3. notepad++与ISE/Vivado关联
  4. react元素显隐控制
  5. 解决debian下看flash视频很卡的问题
  6. Python面向对象中的多态与静态语言(C++,Java)的区别
  7. 20.变量及数据类型
  8. Guava学习笔记(零):Google Guava 类库简介
  9. IE9 RC【离线安装包】!终于等到了!
  10. 魔兽争霸修改器,局域网内使用!防封号!!!!!!!!
  11. 四位共阳极数码管显示函数_实验四 共阴数码管静态显示
  12. 徐思201771010132《面向对象程序设计(java)》第六周学习总结
  13. 详解 VOC 数据集
  14. fanc 机器人_24个FANUC机器人的视觉功能详细介绍
  15. linux权限可被登录用户读取,Linux 用户及权限详解
  16. 备份一体机的制作原理以及工艺
  17. Java响应式流框架Reactor中的Mono和Flux
  18. Ubtun16.04 配置baxter机器人
  19. 华为海思 hikey970 烧录固件 ubuntu桌面版
  20. 信息安全与网络空间安全

热门文章

  1. 《Kubernetes权威指南:从Docker到Kubernetes实践全接触》读书笔记
  2. 奋斗吧,程序员——第五十一章 黑云压城城欲摧,甲光向日金鳞开
  3. 垃圾短信多,你的手机可能被监控了!
  4. finally和return执行的先后顺序
  5. python-name属性
  6. My Sixty-seventh Page - 0-1背包问题理论 - By Nicolas
  7. 上下滚动 标题停留(字母,图片)
  8. android NFC 开发学习笔记(1)
  9. 广州面试题------广东中建普联科技股份有限公司
  10. 条形码、二维码的生成与扫描、解析本地二维码