本文主要讨论和撤销有关的 git 操作。目的是让读者在遇到关于撤销问题时能够方便迅速对照执行解决问题,而不用去翻阅参数繁多的 git 使用说明。

一开始你只需了解大致功能即可,不必记住所有命令和具体参数。事实上,如果没有经过反复多次的操作,这些没血没肉的命令是很难被全部记清楚的,就算现在记住了,也会很快遗忘(天赋异禀,过目不忘者除外)。建议读者在遇到特定问题时对照场景操作,多用几次自然就记住了。

首先,我们再看看上一篇文章中的这张图:

git 命令和文件状态转换

这张图能让你一目了然的看到各种命令产生的效果。其中箭头移动方向可以理解成文件版本的复制方向。根据箭头的指向,我们能清楚的看到每个操作所产生的影响。几乎所有的git操作也就是让文件在这三个工作区域内移动,列如:

  • git add files 工作目录下files复制 ->暂存区;
  • git checkout files 暂存区files复制 -> 工作目录;
  • git commit 暂存区内的文件作为一个版本保存 -> 版本库。

为了使本文更具实用性,让我们来结合上图,通过实际项目中可能遇到的问题,以 Q&A 的形式来逐一讨论,当你遇到相似问题时可以迅速找到解决方法。

  1. Q: git add之后如何撤销?

    TL;DR [1] 答案: 可以使用 git reset 撤销 所有 暂存区域文件。使用git
    reset file 来撤销特定的文件。该命令只是把暂存区内容移除,不会覆盖工作目录中已经修改过的同名文件。

    考虑这个场景,你正在为你的项目添加一个新功能,快完成时,你打算暂存起来,测试好了再 commit,于是你使用:

    git add home.js

    把涉及新功能改动的文件 home.js 暂存起来。此时你突然接到一个很紧急的 bug,需要立刻修复,你在一通 debug 之后成功 fix 了 bug,于是把涉及该 bug 的更新添加到暂存区:

    git add main.js common.js

    在准备使用 git commit 提交改动之前,你习惯性看看暂存区有哪些文件会被提交,于是你使用 git status 发现暂存区有三个文件:

    home.js main.js common.js

    很显然,你此时只想提交关于 bug 的修改部分文件,如果此时使用 git commit 会把关于其他功能的修改一起提交。那如何移走暂存区域home.js?很简单,只要执行 git reset 即可移除:

    git reset home.js

    之后执行 git commit 来提交这次 bug 修复所引起的改动。

    当然,如果你打算先提交新功能改动之后再提交 bug 修复内容,你可以先使用

    git reset main.js common.js 取消暂存区 bug 修改相关文件,再执行

    git commit

  2. Q: 如何丢弃工作目录的更改?

    答案:使用 git checkout file 。 注意 ,该操作不可逆,一旦被执行,你的改动都会消失,一般情况下只有你非常确定不需要工作目录下的最新改动内容才会这么做。
    该命令会用暂存区的 file 内容覆盖掉工作目录的 file 文件内容。如果这个文件没有加入暂存区(或者说暂存区该 file 内容和Git仓库内容相同),执行该命令后,工作目录中该文件版本将和Git仓库最近一次提交版本相同。举例:

    git checkout home.js

    注意,如果你正好有个 branch 名字叫 home.js, git checkout 会checkout 一个 branch,此时你可以加上 -- 来用来表明这是个文件。

    git checkout -- home.js

    如果你想直接用最新的git仓库文件同时覆盖掉暂存区和工作目录内容可以使用(参见前文图示):

    git checout HEAD -- files

  3. Q: 如何丢弃本地仓库的 commit 内容?

    git reset --soft HEAD~1

    执行上述操作会撤销最后一次 commit 产生的效果并且保留 working directory 你所改动的内容。

    git reset --hard HEAD~1

    执行上述操作会撤销最后一次 commit 产生的效果并且 覆盖 working directory 你所改动的内容。慎用,你一天的工作可能就此付之一炬,出了问题不能懒我(无辜状)。

    如果想取消最近N次的 commit 内容,只要把上面的1换成相应的数字即可。

  4. Q: 如何获取Git服务器上最新内容?

    经常拉取新内容,可以减少 code merge。只要简单的执行 git pull 即可。注意还有一个类似的命令是 git fetch,二者的区别简单来说是:

    git pull = git fetch + git merge

最后总结关于撤销操作的要点

操作 撤销
git add file git reset

重置暂存区内容,使得暂存区版本和仓库版本一致

git reset file

重置某一个文件的暂存状态,产生效果也就是把该文件从暂存区移除
修改了工作区文件 git checkout -- files

用暂存区版本 覆盖 工作区文件

git checout HEAD -- files

用git仓库最近版本 覆盖 工作区文件
git commit git reset --soft HEAD~1

撤销最近一次 commit 且不删除工作区改动

git reset --hard HEAD~1

撤销最近一次 commit 且强制同步工作区版本到这 commit 改动之前状态


Git学习总结(11)——Git撤销操作详解的更多相关文章

  1. hibernate框架学习笔记11:Criteria查询详解

    创建实体类对象: package domain; import java.util.HashSet; import java.util.Set; //客户实体 public class Custome ...

  2. JAVAEE学习——hibernate03:多表操作详解、级联、关系维护和练习:添加联系人

    一.一对多|多对一 1.关系表达 表中的表达 实体中的表达 orm元数据中表达 一对多 <!-- 集合,一对多关系,在配置文件中配置 --> <!-- name属性:集合属性名 co ...

  3. 【学习笔记】C++文件操作详解(ifstream、ofstream、fstream)

    C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstre ...

  4. Git学习系列之Git基本操作提交项目(图文详解)

    前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...

  5. Git学习系列之Git基本操作拉取项目(图文详解)

    前面博客 Git学习系列之Git基本操作推送项目(图文详解) 当然,如果多人协作,或者多个客户端进行修改,那么我们还要拉取(Pull ... )别人推送到在线仓库的内容下来. 大神们是不推荐使用 pu ...

  6. Git学习系列之Git基本操作推送项目(图文详解)

    前面博客 Git学习系列之Git基本操作提交项目(图文详解) 如果完成到一定程度,那么可以推送到远端在线仓库. 推送之前,请确保你已经设置了全局的 user.name 和 user.email, 如果 ...

  7. Git远程操作详解(转)

    转自:http://www.ruanyifeng.com/blog/2014/06/git_remote.html Git远程操作详解   Git是目前最流行的版本管理系统,学会Git几乎成了开发者的 ...

  8. 转载: GIt远程操作详解

    Git远程操作详解   作者: 阮一峰 日期: 2014年6月12日 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介 ...

  9. git学习------>写给 Git 初学者的7个建议

    PS:本文转载于(http://blog.jobbole.com/50603/),本文由 伯乐在线 - 吴鹏煜 翻译. 英文出处:(http://sixrevisions.com/web-develo ...

随机推荐

  1. 推送_即时推送_即时通讯_在线Demo

    [伊尚]美容店(万达店)找创业合伙人(限女生) 点击查看Demo 线上预览 运行Demo截图如下: 线上预览

  2. 怎样又一次编译linux内核

    linux作为自由软件.在广大爱好者的支持下,内核版本号不断更新. 新的内核修订了就得内核的bug,并添加了很多新的特性.假设用户须要使用这些新的特性或者依据自己的系统量身定做一个更高效或更稳定的内核 ...

  3. 推断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  4. 【翻译自mos文章】Oracle GoldenGate 怎么在源头的传输进程和目的端的server/collector进程之间分配 port?

    Oracle GoldenGate 怎么在源头的传输进程和目的端的server/collector进程之间分配 port? 来源于: How Does GoldenGate Allocates Por ...

  5. java.util.ComparableTimSort中的sort()方法简单分析

    TimSort算法是一种起源于归并排序和插入排序的混合排序算法,设计初衷是为了在真实世界中的各种数据中能够有较好的性能. 该算法最初是由Tim Peters于2002年在Python语言中提出的. T ...

  6. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第0步---知识点总结&amp;效果预览&amp;设计思路

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏.这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写.第一别全然照搬代码:第二能够说 ...

  7. 兼容chrome和ie的音乐播放

    兼容chrome和ie的音乐播放(Ie7 Ie8 Ie9 均測试过 ) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  8. 08.HttpUrlconnection方式调用

    package com.rl.client; import java.io.BufferedInputStream; import java.io.BufferedReader; import jav ...

  9. 什么是Ajax和JSON,他们的优缺点?

    ajax的概念:ajax是一种通过后台与服务器进行少量的数据交换,实现页面异步更新 是一种创建交互式网页应用的网页开发技术. json的概念:json是一种轻量级的数据交换格式,具有良好的可读和便于快 ...

  10. ADODB.RecordSet常用方法查询

    rs = Server.CreateObject("ADODB.RecordSet") rs.Open(sqlStr,conn,1,A) 注:A=1表示读取数据:A=3表示新增.修 ...