[译]reset, checkout和revert
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的更多相关文章
- git代码回滚:Reset、Checkout、Revert的选择
代码回滚:Reset.Checkout.Revert的选择 Zhongyi Tong edited this page on Dec 8, 2015 · 5 revisions Pages 19 Ho ...
- 代码回滚:Reset、Checkout、Revert的选择
代码回滚:Reset.Checkout.Revert的选择 Git仓库有三个主要组成——工作目录,缓存区和提交历史. 从图中我们可以看出,缓存区或者叫索引,其实是指一整套即将被下一个提交的文件集合.也 ...
- 关于git的reset、checkout、revert
https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/file-level-operations 最 ...
- Git 相关问题分享,git reset与git revert的区别?
1.如果我在git add 后想要撤销操作,该怎么做? 使用 git rm --cache [文件名/ *] 或者 git reset HEAD, 为什么这个命令也会有效果呢,实际上reset将 HE ...
- 代码回滚:Reset、Checkout、Revert 的选择
git reset.git checkout 和 git revert 是你的 Git 工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文 ...
- 详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别
http://josh-persistence.iteye.com/blog/2215214
- Git撤销&回滚操作(git reset 和 get revert)
转自:https://blog.csdn.net/asoar/article/details/84111841 git的工作流 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 ...
- 关于git reset和git revert之前的区别
很多时候,git新手容易误操作,比如,在levelIISZ-1.4.dev分支下,运行了git pull idc cpp-1.0的结果,这样做麻烦很大,经常导致maven项目格式不正确,这个时候,可以 ...
- git reset与git revert的区别
http://alpha-blog.wanglianghome.org/2010/07/30/git-partial-rollback/ reset(版本撤回) 格式 git reset [-q] [ ...
随机推荐
- [WPF系列]-高级部分 需要区分的东东
ContentControl VS ContentPresenter What's the difference between ContentControl and ContentPresenter ...
- VMware下CentOS6.8配置GFS文件系统
1.GFS介绍 GFS简要说明,它有两种: 1. Google文件系统:GFS是GOOGLE实现的是一个可扩展的分布式文件系统,用于大型的.分布式的.对大量数据进行访问的应用.它运行于廉价的普通硬件上 ...
- Oracle闪回技术详解
概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速 ...
- JavaScript获取客户端计算机硬件及系统等信息的方法
JavaScript获取客户端计算机硬件及系统等信息的方法 JavaScript 获取客户端计算机硬件及系统信息 通过WMI来实现获取客户端计算机硬件及系统信息: function getSysInf ...
- 三维网格补洞算法(Radial Basis Function)
在逆向工程中,由于设备或模型的原因,我们获取得到的三维模型数据往往并不完整,从而使得生成的网格模型存在孔洞,这对后续的模型分析会造成影响.下面介绍一种基于径向基函数(RBF:Radial Basis ...
- BZOJ1856[SCOI2010]字符串
Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...
- PHP开发环境搭建
链接: Q&A1.Mac下的PHP环境搭建 Mac 下如何搭建 PHP 开发环境? [PHP] Mac下homebrew安装及php.mysql.nginx环境安装及配置个人PHP开发环境的选 ...
- IT行业的技术类岗位分为许多种,如何判断自己适合哪种?
A.硬件工程师B.软件工程师C.UI设计师D.仿真工程师E.ERP工程师F.集成工程师G.系统架构设计师H.数据库工程师I.网络管理员J.网络安全工程师K.网站架构设计师L.网页设计M.Flash设计 ...
- 您还在招聘网上海量投简历然后等面试机会吗?那你已经OUT了。
工作也可以来找我们.不行看完这篇. 从毕业到现在,换了2次工作.每次都在为招工组烦恼.找工作这个问题,不管是应届生还是职场老手.都面临一个问题就是找工作的平台.纵观目前的找工作的形式,主流的不外乎就两 ...
- testng 6.8.6 eclipse plugin
http://files.cnblogs.com/mikelij/testng.zip