git reset, git checkout, git revert 区别 (译)
博客原文地址: http://blog.mexiqq.com/index.php/archives/3/
题记:团队中大多数成员使用 sourceTree 和 github 两款 git 工具,然而大家对于图形化工具提供的 reset,checkout,revert 功能点并不是很了解,甚至于混淆,然后凭借猜测去使用。功夫不负有心人,在尝试过多次冲突处理或分支开发的坑后,终于形成了自己的一套使用方式,可喜可贺。然而问题的解决方案的并不是效率最高的,内部的执行过程我们也不清楚,这对于一个自律的程序艺术家是无法接受的。基于这个问题,翻译这篇博客,为 git 中高级用户的 undo 操作提供参考。鼓励在熟悉命令行操作再通过图形化工具提高开发效率。水平有限,释疑为主,翻译为辅
Reset Checkout and Revert
原文地址:https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting
git reset, git checkout, git revert 命令是最有用的三条 git 命令。他们可以帮助你撤销 repo 的一些操作,并且前两条命令既可以用于 commit 级别,也可以用于 file 级别。
因为他们很相似,所以很容易混淆。这片文章,我们将比较他们的相同和不同之处。
阅读本文前需要了解 git repo 的三大 components,分别是 working directory
(代码仓库) staged snapshot
(快照:add的缓存库) commit history
(commit历史) ,这将更好的帮助你理解这三条命令。
commit 级别的操作
传递给 git reset
和 git checkout
的参数会决定命令的作用范围。当命令并不包括含一个文件路径时,命令作用于整个 commit
。
Reset:
在 commit
级别上,git reset
命令移动 HEAD
到当前分支的一个 commit
, 这可以用来撤销当前分支的一些 commit
。
例如,下面的命令会让 `hotfix` 分支回退两个 commits
git checkout hotfix
git reset HEAD~2
先前在 HEAD 之前的两次 commit 现在处在 HEAD 之后,这意味着他们在下一次 git 提交时被作为垃圾删掉,换句话说这两次提交会被抛弃。如下图所示:
git reset用于撤销未被提交到远端的改动。除了可以移动当前分支的HEAD,你可以通过不同的标记选择修改 staged snapshot 或者 working directory
--soft
:staged snapshot
和working directory
都未被改变 (建议在命令行执行后,再输入 git status 查看状态)--mixed
:staged snapshot
被更新,working directory
未被更改。【这是默认选项】(建议同上)--hard
:staged snapshot
和working directory
都将回退。
--hard 很危险,它会直接回退你之前所有的修改,使用前,可以事先保存 commit id.
【这些标记经常和HEAD
一起使用。例如,git reset --mixed HEAD
可撤销所有缓存改动,但是保留他们在工作目录下。git reset --hard HEAD
可彻底删除没有提交的改动。】
checkout
到现在为止,你应该已经熟悉 commit
级别的 git checkout
了。当你传送一个 branch name
名字时,你将更换当前的分支.
git checkout hotfix
上面的命令会切换 HEAD 到不同的分支,并且更新当前的 working directory
去匹配。因为会覆盖当前的本地更改,所以更换分支前git
强制你彻底放弃或者提交存储当前的更改。不同于 git reset
, git checkout
不会废弃任何分支或提交。
你也可以 checkout
到任何一次 commit
,通过提供 commit Id
作为参数.
比如下面的命令。
git checkout HEAD~2/[commit id]
这对于 review
repo 的某个 version 的代码很有用。然而,如果再次添加新的提交就无法返回原先的状态。因此,你应该在修改前总是创建一个新的分支。
Revert
git revert
命令通过创建一次新的 commit
来撤销一次 commit
所做出的修改。这种撤销的方式是安全的,因为它并不修改 commitm history
, 比如下边的命令将会查出倒数第二次(即当前commit的往前一次)提交的修改,并创建一个新的提交,用于撤销当前提交的上一次 commit
。
git checkout hotfix
git revert HEAD~2
如下图所示:
File 级别的操作
git reset
和 git checkout
命令同样可以接受一个可选的文件路径作为参数,这样可以将操作限制在一个单独的文件中。
Reset:
当调用一个文件路径时,git reset
命令会更新 staged snapshot
去匹配某次 commit
。 下面的命令将会使文件回退一个 commit
。
git reset HEAD~1 [文件](不建议使用)
【--soft、--mixed、--hard标记此时不起作用,会更新staged snapshot,但不更新working directory】
Checkout
git checkout
命令 和 git reset
类似,除了它会更新 working directory
, 而不是 staged snapshot
如下命令将会更新 working directory
去匹配某次 commit
git checkout HEAD~1 [文件]
Summary:
commands | scope | common user cases | |
---|---|---|---|
git reset | Commit | Discard commits in a private branch or throw away uncommited changes | |
git reset | File | Unstage a file | |
git checkot | Commit | switch between branches or inspect old snapshot | |
git checkout | File | Discard changes in the working directory | |
git revert | commit | Undo commits in a public branch | |
git revert | File | 不支持 |
git reset, git checkout, git revert 区别 (译)相关推荐
- git 回退到上个版本 rollback 回滚 git reset HEAD, git 回退到上一版本
git回退到上个版本 git reset --hard HEAD^ 回退到前3次提交之前,以此类推,回退到n次提交之前 git reset --hard HEAD~3 查看commit的sha码 gi ...
- git reset --hard、git reset --sort及git revert区别
一. 在git操作中,有时候,进行了错误的提交,但是还没有push到远程分支,想要撤销本次提交,可以使用git reset –-soft/hard命令. 1.二者区别: git reset –-sof ...
- Git撤销文件的修改(git checkout -- file)(git reset HEAD file)(git reset HEAD~)
1 撤销没有add到暂存储区文件 git checkout -- file 如果我们把文件rm了,git statu肯定会显示出来,我们怎么还原这个文件呢?还是用上面的命令 2 撤销到add到暂存 ...
- Git reset(回滚) 和 revert(撤销)(图文详解)
1.序 在利用GIT实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法. reset:删除直到XXX ...
- git reset中hard与soft区别
前言 对于我们日常开发中,我们常用的方法可能是git reset --hard,来强行回退commit所提交的信息,这是不友好的,也许我们希望对误操作提交的commit不进行删除而是重新修改并进行提 ...
- 代码回滚:Reset、Checkout、Revert 的选择
BY 童仲毅(geeeeeeeeek@github) 这是一篇在原文(BY atlassian)基础上演绎的译文.除非另行注明,页面上所有内容采用知识共享-署名(CC BY 2.5 AU)协议共享. ...
- git reset revert rebase 区别
最近合并他人代码,因为代码是从git代码库之外来的,于是出了各种问题.于是又翻看了git教程.这里推荐两篇: Git教程 - 廖雪峰的官方网站 非常通俗易懂,教了最基本的,十分实用. ###Git 基 ...
- git的reset和checkout的区别
Git里有三个区域很重要 HEAD 指向最近一次commit里的所有snapshot Index 缓存区域,只有Index区域里的东西才可以被commit Working Directory 用户操作 ...
- git checkout和git reset的一些区别以及配置git简写命令
一.背景 在调试代码的时候,每次都要通过git上传到服务器调试,实在是一件很麻烦的事情.所以对于一些微小的改动,我就直接在服务器上修改.等调试成功之后,用git reset再回退到之前的版本,后来经过 ...
最新文章
- C语言volatile关键字详解
- PTA 基础编程题目集 7-14 求整数段和 C语言
- new Date 兼容性问题
- 显示乱七八糟图片问题之解决
- filazilla搭建ftp_Windows7下利用FileZilla Server搭建ftp
- java面向对象——包+继承+多态(一)
- HDU 1525 类Bash博弈
- 让我们发展纯粹的金钱关系吧,那多美好(转)
- 大数据之路:阿里巴巴大数据实践(数据模型篇)
- linux下看学校的IPTV
- 前端vue+后台node实现获取微信用户基本信息+调用微信JS-SDK(下篇)
- 根据六边形边长求六边形面积
- 人工智能 —— 知识图谱
- 【一】综合架构(web网站架构)
- JEP 286: Local-Variable Type Inference
- mysql占用服务器CPU100%的解决办法
- flutter圆形进度和条形进度绘制
- 开发一款好玩的地图app
- Firebase Crashlytics收集崩溃报告
- ffmpeg关于dts和pts收集
热门文章
- 仪表盘刻度调整_惊艳了我的仪表盘 那些年我遇到最美的“面孔”
- php 图片系统,Linger
- 如何和后台接触的_后台产品,不只是做支持
- 四川大学 设计专业 C语言必修,四川大学C语言2001年真题_跨考网
- 过滤特征_机器学习深度研究:特征选择中几个重要的统计学概念
- php 复选框全选和取消,基于JavaScript实现复选框的全选和取消全选
- 八、Python第八课——元组与列表、代码格式
- 反思 大班 快乐的机器人_幼儿园大班教案《快乐的桌椅》含反思
- 对Docker镜像layer的理解
- PHP7数字三角形代码,倒数字三角