本文主要讨论和撤销有关的 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 改动之前状态

参考文献

  1. Pro Git book
  2. A Visual Git Reference 须自备梯子

来自:http://www.jianshu.com/p/4ebbff227b87

掌握Git撤销操作,随心所欲控制文件状态的更多相关文章

  1. Git 撤销操作、删除文件和恢复文件

    大致介绍 经过前面的学习,已经建立了版本库,并上传了文件,这次来学习对这些文件进行基本的操作,即: ◆ 撤销操作 ◆ 删除文件 ◆ 恢复文件 我在此之前,已经将三个文件提交到了版本库 撤销操作 撤销操 ...

  2. Git学习之路(4)- 撤销操作、删除文件和恢复文件

    ▓▓▓▓▓▓ 大致介绍 经过前面的学习(小白学Git)已经建立了版本库,并上传了文件,这次来学习对这些文件进行基本的操作,即: ◆ 撤销操作 ◆ 删除文件 ◆ 恢复文件 我在此之前,已经将三个文件提交 ...

  3. git 学习记录—— git 中的仓库、文件状态、修改和提交操作等

    最近开始学习使用版本控制工具  git .学习方式主要通过阅读 git 网站上的 Pro git 和动手实践,使用的系统为 Ubuntu16.04LTS,以及 Windows 8.1. 本文主要关注 ...

  4. 从零开始使用git第三篇:git撤销操作、分支操作和常见冲突

    从零开始使用git 第三篇:git撤销操作.分支操作和常见冲突 第一篇:从零开始使用git第一篇:下载安装配置 第二篇:从零开始使用git第二篇:git实践操作 第三篇:从零开始使用git第三篇:gi ...

  5. git 撤销修改以及删除文件

    撤销修改 1.如果当你修改了代码,然后又发现修改错误以后,想撤销前面的操作的时候该怎么办呢? 既然错误发现得很及时,就可以很容易地纠正它.你可以删掉最后一行,手动把文件恢复到上一个版本的状态.如果用 ...

  6. Git学习总结(11)——Git撤销操作详解

    本文主要讨论和撤销有关的 git 操作.目的是让读者在遇到关于撤销问题时能够方便迅速对照执行解决问题,而不用去翻阅参数繁多的 git 使用说明. 一开始你只需了解大致功能即可,不必记住所有命令和具体参 ...

  7. Git撤销操作

      撤销操作的相关文章 http://www.linuxidc.com/Linux/2015-06/119350.htm   ——撤销已经修改,但是还没有添加到暂存区的操作: 解决方案: 有两种情形: ...

  8. git学习笔记03-本地git常用操作及原理-文件增删改

    1.查看git状态 git status  这个可以告诉我们对git做了哪些操,比如增删改 2.既然我们修改了东西,有的时候想看看修改了什么,毕竟我们的记忆力并不如电脑 git diff 文件名 (默 ...

  9. [转]Git 撤销操作

    二. Git撤消操作 12.1 修改最后一次提交 git commit --amend 1.新建一个文件 2.提交一个之前的更改 3.跟踪这个文件 4.跟前一次一起提交 提示你是否重新编辑提交说明,如 ...

随机推荐

  1. MySQL: Speed of INSERT Statements

    Speed of INSERT Statements To optimize insert speed, combine many small operations into a single lar ...

  2. hiho 有序01字符串 dp

    题目1 : 有序01字符串 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于一个01字符串,你每次可以将一个0修改成1,或者将一个1修改成0.那么,你最少需要修改多少 ...

  3. Mac下配置NDK环境

    下载NDK 这里写图片描述配置NDK开发环境 第一步:打开Mac终端 Snip20170208_1.png 第二步:在终端中输入:open -e .bash_profile,打开.bash_profi ...

  4. 【Linux】无法添加用户,报“useradd: cannot open /etc/passwd”问题解决过程记录

    问题描述 今天在一个新的Linux环境添加用户的时候,发现不能添加,遇到了以下错误 useradd: cannot open /etc/passwd 解决方法 用lsattr命令查看/etc/pass ...

  5. 【Python】简单实现爬取小说《天龙八部》,并在页面本地访问

    背景 很多人说学习爬虫是提升自己的一个非常好的方法,所以有了第一次使用爬虫,水平有限,依葫芦画瓢,主要作为学习的记录. 思路 使用python的requests模块获取页面信息 通过re模块(正则表达 ...

  6. #if 0 #endif && #if 1 #endif ----待整理

    在看一个 usbcan 的上位机例程中发现了这个,于是百度下,记录下来.(参考:http://nevel.cnblogs.com/p/6378035.html)

  7. 在阿里云服务器上搭建 Apache Tomat 应用

    在阿里云上购买一台服务器,系统采用 window 2008 Server 企业版,64位 1.下载Java7 JRE,安装 http://www.java.com/zh_CN/download/man ...

  8. asp.net mvc Route路由映射.html后缀 404错误

    [HttpGet] [Route("item/{id:long:min(1)}.html")] 首先RouteConfig配置文件RegisterRoutes方法添加以下代码: r ...

  9. 微信小程序UI------实现携程首页顶部的界面(弹性布局)

    今天写了一个携程界面的UI,利用H5的弹性盒子来实现,学过H5弹性盒子的,来看是比较方便的,因为CSS代码都差不多. 可以看看这篇博客 快速使用CSS 弹性盒子 效果图如下: 主要是携程首页的四个模块 ...

  10. SpringAOP源码分析总结

    1.Advisor(增强器):充当Advice和Pointcut的适配器,类似使用Aspect的@Aspect注解的类(前一章节所述).一般有advice和pointcut属性. 祖先接口为org.s ...