博客原文地址: 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 resetgit 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

  • --softstaged snapshotworking directory 都未被改变 (建议在命令行执行后,再输入 git status 查看状态)

  • --mixedstaged snapshot 被更新, working directory 未被更改。【这是默认选项】(建议同上)

  • --hardstaged snapshotworking 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 resetgit 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 区别 (译)相关推荐

  1. git 回退到上个版本 rollback 回滚 git reset HEAD, git 回退到上一版本

    git回退到上个版本 git reset --hard HEAD^ 回退到前3次提交之前,以此类推,回退到n次提交之前 git reset --hard HEAD~3 查看commit的sha码 gi ...

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

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

  3. Git撤销文件的修改(git checkout -- file)(git reset HEAD file)(git reset HEAD~)

    1  撤销没有add到暂存储区文件 git checkout -- file 如果我们把文件rm了,git statu肯定会显示出来,我们怎么还原这个文件呢?还是用上面的命令 2  撤销到add到暂存 ...

  4. Git reset(回滚) 和 revert(撤销)(图文详解)

    1.序 在利用GIT实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法.         reset:删除直到XXX ...

  5. git reset中hard与soft区别

    前言  对于我们日常开发中,我们常用的方法可能是git reset --hard,来强行回退commit所提交的信息,这是不友好的,也许我们希望对误操作提交的commit不进行删除而是重新修改并进行提 ...

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

    BY 童仲毅(geeeeeeeeek@github) 这是一篇在原文(BY atlassian)基础上演绎的译文.除非另行注明,页面上所有内容采用知识共享-署名(CC BY 2.5 AU)协议共享. ...

  7. git reset revert rebase 区别

    最近合并他人代码,因为代码是从git代码库之外来的,于是出了各种问题.于是又翻看了git教程.这里推荐两篇: Git教程 - 廖雪峰的官方网站 非常通俗易懂,教了最基本的,十分实用. ###Git 基 ...

  8. git的reset和checkout的区别

    Git里有三个区域很重要 HEAD 指向最近一次commit里的所有snapshot Index 缓存区域,只有Index区域里的东西才可以被commit Working Directory 用户操作 ...

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

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

最新文章

  1. C语言volatile关键字详解
  2. PTA 基础编程题目集 7-14 求整数段和 C语言
  3. new Date 兼容性问题
  4. 显示乱七八糟图片问题之解决
  5. filazilla搭建ftp_Windows7下利用FileZilla Server搭建ftp
  6. java面向对象——包+继承+多态(一)
  7. HDU 1525 类Bash博弈
  8. 让我们发展纯粹的金钱关系吧,那多美好(转)
  9. 大数据之路:阿里巴巴大数据实践(数据模型篇)
  10. linux下看学校的IPTV
  11. 前端vue+后台node实现获取微信用户基本信息+调用微信JS-SDK(下篇)
  12. 根据六边形边长求六边形面积
  13. 人工智能 —— 知识图谱
  14. 【一】综合架构(web网站架构)
  15. JEP 286: Local-Variable Type Inference
  16. mysql占用服务器CPU100%的解决办法
  17. flutter圆形进度和条形进度绘制
  18. 开发一款好玩的地图app
  19. Firebase Crashlytics收集崩溃报告
  20. ffmpeg关于dts和pts收集

热门文章

  1. 仪表盘刻度调整_惊艳了我的仪表盘 那些年我遇到最美的“面孔”
  2. php 图片系统,Linger
  3. 如何和后台接触的_后台产品,不只是做支持
  4. 四川大学 设计专业 C语言必修,四川大学C语言2001年真题_跨考网
  5. 过滤特征_机器学习深度研究:特征选择中几个重要的统计学概念
  6. php 复选框全选和取消,基于JavaScript实现复选框的全选和取消全选
  7. 八、Python第八课——元组与列表、代码格式
  8. 反思 大班 快乐的机器人_幼儿园大班教案《快乐的桌椅》含反思
  9. 对Docker镜像layer的理解
  10. PHP7数字三角形代码,倒数字三角