git reset, git checkout, git revert能让你撤销你本地仓储的一些修改,  前两种命令可以作用于commit或者一个文件.

Commit级别的操作

注意了git revert只能作用于commit不能作用于文件.

reset

在commit级别, reset把你的branch的顶端移动到另外一个commit. 可以用来删除你当前分支的commit. 例如, 下面的命令把hotfix分支往后后退两次.

git checkout hotfix
git reset HEAD~2

hotfix最近两个commit成了dangling commit, 这意味在下次git指定垃圾回收的时候可以删除他们.

这种reset的用法可以用来撤销没有被共享给其他人的修改.

除了能移动当前的分支, 还可以变更stage区的快照,修改工作目录.

  • --soft stage区的快照和工作目录都不会有任何变化.
  • --mixed stage区的快照更新匹配到指定的commit的状态, 工作目录不会有修改. 这个是默认的option.
  • --hard stage区的快照和工作目录都后被更新到指定的commit的状态

上面三个标记经常和HEAD一起使用. git reset --mixed HEAD 会作用于stage区, 但是不会影响工作目录的修改. 如果你想完全的扔掉没有commit的修改, 你可以使用git reset --hard HEAD. 这个是git reset最常用的两种方法.

当你传递一个commit给git reset的时候要非常小心, 因为这会修改当前分支的历史. 当这些历史已经被push了时, 这样做非常不好.

checkout

当你传递一个分支名给checkout, 会切换分支.

git checkout hotfix

上面的命令移动HEAD到另外一个分支, 更新你的工作目录.

你还可以checkout commit. 会将HEAD指向你指定的commit. 下面的命令checkout到当前commit的爷爷:

git checkout HEAD~2

这用来检查你项目的老版本非常有用. 因为没有任何一个分支指向当前HEAD, 所以checkout commit之后处于一个detached HEAD的状态. 在这种状态下添加的新的commit是多其它所有的分支不可见的. 所以, 你应该在添加commit到detached HEAD之前应该新建一个分支.

revert

revert通过新建一个新的commit来撤销commit. 这是一种安全的撤销方式. 下面的例子通过新建一个新的commit来撤销倒数第三个commit.

git checkout hotfix
git revert HEAD~2  

git revert应该被用于撤销一个公共的分支, git reset用来撤销私有的分支.

文件级别的操作

git reset和git checkout都可以接受一个文件路径做为参数. 当指定了一个文件的路径的时候, reset和checkout只操作一个单一的文件.

reset

git reset更新stage区的快照去匹配指定commit时候的版本. 下面的命令把foo.py恢复到2nd-to-last commit的时候的状态并放入stage区:

git reset HEAD~2 foo.py

运行git reset HEAD foo.py会把stage区的foo.py删除.  工作目录下面的修改不会发生变化.

--soft, --mixed, --hard标记在git reset文件的时候不起任何作用, stage的快照总是会被更新, 工作目录不会被更新到.

checkout

checkout 有点类似于reset, 但是checkout不会更新stage区, 而是更新工作目录.

下面的命令将工作区中的foo.py的内容更新为倒数第三次commit的内容:

git checkout HEAD~2 foo.py

git checkout HEAD foo.py的效果就是丢弃foo.py没有在stage区的修改. 效果和git reset HEAD --hard一样, 但是checkout只作用于一个单独的文件.

总结

Command Scope Common use case
git reset Commit-level 丢弃私有分支的commit或丢弃没有commit的修改
git reset File-level unstage一个文件
git checkout Commit-level 切换分支或检查一个老的快照
git checkout File-level 丢弃工作目录的修改
git revert Commit-level 撤销公共分支的commit
git revert File-level revert没有文件级别的操作

[译]reset, checkout和revert的更多相关文章

  1. git代码回滚:Reset、Checkout、Revert的选择

    代码回滚:Reset.Checkout.Revert的选择 Zhongyi Tong edited this page on Dec 8, 2015 · 5 revisions Pages 19 Ho ...

  2. 代码回滚:Reset、Checkout、Revert的选择

    代码回滚:Reset.Checkout.Revert的选择 Git仓库有三个主要组成——工作目录,缓存区和提交历史. 从图中我们可以看出,缓存区或者叫索引,其实是指一整套即将被下一个提交的文件集合.也 ...

  3. 关于git的reset、checkout、revert

    https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/file-level-operations 最 ...

  4. Git 相关问题分享,git reset与git revert的区别?

    1.如果我在git add 后想要撤销操作,该怎么做? 使用 git rm --cache [文件名/ *] 或者 git reset HEAD, 为什么这个命令也会有效果呢,实际上reset将 HE ...

  5. 代码回滚:Reset、Checkout、Revert 的选择

    git reset.git checkout 和 git revert 是你的 Git 工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文 ...

  6. 详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别

    http://josh-persistence.iteye.com/blog/2215214

  7. Git撤销&回滚操作(git reset 和 get revert)

    转自:https://blog.csdn.net/asoar/article/details/84111841 git的工作流 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 ...

  8. 关于git reset和git revert之前的区别

    很多时候,git新手容易误操作,比如,在levelIISZ-1.4.dev分支下,运行了git pull idc cpp-1.0的结果,这样做麻烦很大,经常导致maven项目格式不正确,这个时候,可以 ...

  9. git reset与git revert的区别

    http://alpha-blog.wanglianghome.org/2010/07/30/git-partial-rollback/ reset(版本撤回) 格式 git reset [-q] [ ...

随机推荐

  1. 使用FileZilla等软件搭建ftp服务器

    FTP的全称是File Transfer Protocol(文件传输协议).顾名思义,就是专门用来传输文件的协议. FTP服务器,则是在互联网上提供存储空间的计算机,它们依照FTP协议提供服务.简单地 ...

  2. 《InsideUE4》-7-GamePlay架构(六)PlayerController和AIController

    PlayerController:你不懂,伴君如伴虎啊 AIController:上来,我自己动 引言 上文我们谈到了Component-Actor-Pawn-Controller的结构,追溯了ACo ...

  3. postman使用之五:Runner的使用

    1.首先在postman新建要批量运行的接口文件夹,新建一个接口,并设置好全局变量. 2.然后在Test里面设置好要断言的方法 如: tests["Status code is 200&qu ...

  4. 有关sql server 2008无法导入数据库mdf文件的处理方法

    解决方法1:根据该博客中的引导,加上自己安装版本的细节,可以添加成功 http://www.2cto.com/database/201408/328930.html 解决方法2: 根据<数据库系 ...

  5. 第14章 集合框架(1)-List集合的各种类

    1.概述 1.1.Java集合框架的由来 1.2.什么是集合框架? 1.3.为什么需要集合框架 1.4.常用的框架接口规范 2.Vector类 2.1.存储原理 2.2.构造方法 2.3.常用方法 3 ...

  6. VS 常用高效 快捷键

    强迫智能感知:Ctrl+J.智能感知是Visual Studio最大的亮点之一,选择Visual Studio恐怕不会没有这个原因. 2 撤销:Ctrl+Z.除非你是天才,那么这个快捷键也是最常用的. ...

  7. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 能支撑10万以上客户端的数据同步下载问题

    庞大的业务系统,特别是需要有离线作业操作支持的核心业务系统,需要有强大的基础数据同步功能,基础数据有在增加.有在变动.有在失效,同时有大量的客户端全天侯的在连接服务器.不间断的在处理核心数据. 经过2 ...

  8. sql server cross/outer apply 用法

    这是 sql server 帮助文档关于apply的描述: 使用 APPLY 运算符(2005或以上版本)可以为实现查询操作的外部表表达式返回的每个行调用表值函数.表值函数作为右输入,外部表表达式作为 ...

  9. npm+node+cordova+ionic 版本匹配

    npm 2.15.8 node 4.4.7 cordova 6.1.0 ionic 1.7.16

  10. 如何理解vue.js组件的作用域是独立的

    vue.js组件的作用域是独立,可以从以下三个方面理解: 1.父组件模板在父组件作用域内编译,父组件模板的数据用父组件内data数据:2.子组件模板在子组件作用域内编译,子组件模板的数据用子组件内da ...