需求一:如何把stage中的修改还原到work dir中

这个需求很常见,也很重要,比如我先将当前work dir中的修改添加到stage中,然后又对work dir中的文件进行了修改,但是又后悔了,如何把work dir中的全部或部分文件还原成stage中的样子呢?

来个实际场景,我先新建两个文件,然后把他们都加到stage

$ touch a.txt b.txt
$ git add .
$ git status
On branch master
Changes to be committed:
new file: a.txt
new file: b.txt

然后我又修改了a.txt文件:

$ echo hello world >> a.txt
$ git status
On branch master
Changes to be committed:
new file: a.txt
new file: b.txt Changes not staged for commit:
modified: a.txt

现在,我后悔了,我认为不应该修改a.txt,我想把它还原成stage中的空文件,怎么办?

答案是,使用 checkout 命令:

$ git checkout a.txt
Updated 1 path from the index $ git status
On branch master
Changes to be committed:
new file: a.txt
new file: b.txt

看到了么,输出显示从index区(也就是stage区)更新了一个文件,也就是把work dira.txt文件还原成了stage中的状态(一个空文件)。

当然,如果work dir中被修改的文件很多,可以使用通配符全部恢复成stage

$ git checkout .

有一点需要指出的是,checkout命令只会把被「修改」的文件恢复成stage的状态,如果work dir中新增了新文件,你使用git checkout .是不会删除新文件的。

需求二:比如说commit完之后,突然发现一些错别字需要修改,又不想为改几个错别字而新开一个commithistory

那么就可以使用下面这个命令:

$ git commit --amend

这样就是把错别字的修改和之前的那个commit中的修改合并,作为一个commit提交到history区。

需求三:将history区的文件还原到stage区

这个需求很常见,比如说我用了一个git add .一股脑把所有修改加入stage,但是突然想起来文件a.txt中的代码我还没写完,不应该把它commithistory区,所以我得把它从stage中撤销,等后面我写完了再提交。

$ echo aaa >> a.txt; echo bbb >> b.txt;
$ git add .
$ git status
On branch master
Changes to be committed:
modified: a.txt
modified: b.txt

如何把a.txtstage区还原出来呢?可以使用 git reset 命令:

$ git reset a.txt

$ git status
On branch master
Changes to be committed:
modified: b.txt Changes not staged for commit:
modified: a.txt

你看,这样就可以把a.txt文件从stage区移出,这时候进行git commit相关的操作就不会把这个文件一起提交到history区了。

上面的这个命令是一个简写,实际上reset命令的完整写法如下:

$ git reset --mixed HEAD a.txt

其中,mixed是一个模式(mode)参数,如果reset省略这个选项的话默认是mixed模式;HEAD指定了一个历史提交的 hash 值;a.txt指定了一个或者多个文件。

该命令的自然语言描述是:不改变work dir中的任何数据,将stage区域中的a.txt文件还原成HEAD指向的commit history中的样子。就相当于把对a.txt的修改从stage区撤销,但依然保存在work dir中,变为unstage的状态。

需求四:将work dir中的修改提交到history区

这个需求很简单,先git add然后git commit就行了,或者一个快捷方法是使用命令git commit -a

需求五:将history区的历史提交还原到work dir中

这个场景,我说一个极端一点的例子:比如我从 GitHub 上clone了一个项目,然后乱改了一通代码,结果发现我写的代码根本跑不通,于是后悔了,干脆不改了,我想恢复成最初的模样,怎么办?

依然是使用checkout命令,但是和之前的使用方式有一些不同:

$ git checkout HEAD .
Updated 12 paths from d480c4f

这样,work dirstage中所有的「修改」都会被撤销,恢复成HEAD指向的那个history commit

注意,类似之前通过stage恢复work dircheckout命令,这里撤销的也只是修改,新增的文件不会被撤销。

当然,只要找到任意一个commit的 HASH 值,checkout命令可就以将文件恢复成任一个history commit中的样子:

$ git checkout 2bdf04a some_test.go
Updated 1 path from 2bdf04a
# 前文的用法显示 update from index

比如,我改了某个测试文件,结果发现测试跑不过了,所以就把该文件恢复到了它能跑过的那个历史版本……

需求六:由于HEAD指针的回退,导致有的commit在git log命令中无法看到,怎么得到它们的 Hash 值呢?

只要你不乱动本地的.git文件夹,任何修改只要提交到commit history中,都永远不会丢失,看不到某些commit只是因为它们不是我们当前HEAD位置的「历史」提交,我们可以使用如下命令查看操作记录:

$ git reflog

比如resetcheckout等等关键操作都会在这里留下记录,所有commit的 Hash 值都能在这里找到,所以如果你发现有哪个commit突然找不到了,一定都可以在这里找到。

git的几个常用基本操作的更多相关文章

  1. MatplotLib常用基本操作

    本文记录matlibplot常用基本操作,都是基本功能,不涉及复杂联合操作,其中各用法详细用法可参考官网: 1. 基本画图操作 ##mofan_matplotlib.pyplot import mat ...

  2. 图解git中的最常用命令

    图解git中的最常用命令 Git命令参考手册(文本版) git init                                                  # 初始化本地git仓库(创 ...

  3. git日常使用的常用命令总结

    git日常使用的常用命令总结 git 是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常 ...

  4. git的下载安装以及基本操作

    版权声明:本文为CSDN博主「~李疆」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.转载原文链接:https://blog.csdn.net/qq_403232 ...

  5. 版本控制-Git服务器搭建和常用命令使用

    Git是目前世界上最先进的分布式版本控制系统(没有之一).使用Svn的请参考<版本控制-svn服务器搭建和常用命令(centos 6.3)>,下面介绍Git的常用命令 常用命令 简单版 升 ...

  6. Git 基本概念及常用命令

    一.基本概念 文件的三种状态:(任何一个文件在git中都有以下三种状态) 1) 已提交(committed):表示该文件已经被安全地保存在本地数据库中了. 2) 已修改(modified):表示修改了 ...

  7. git开发流程、常用命令及工具、TortoiseGit使用及常见问题

    根据我最近使用git的一些经历,git是基于分支的版本控制工具,分支有远程分支和本地分支. 一.开发流程 - 从远程服务器的master,clone一份项目文件到本地,然后本地master的基础上br ...

  8. Git基础知识与常用命令

    一:相关概念: 1:工作区(Working Directory): 就是你在电脑里能看到的目录 2:版本库(Repository): 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. ...

  9. Git的配置及常用命令

    Git配置 git config --global user.name "<username>" git config --global user.email &quo ...

随机推荐

  1. OpenCV开发笔记(六十五):红胖子8分钟带你深入了解ORB特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  2. 第一章:开始启程-你的第一行Android代码

    Android 系统为开发者提供了什么? 四大组件 活动(Activity):界面 服务(Service):后台默默运行 广播接收器(Broadcast Receiver):接收.发送广播消息 内容提 ...

  3. 深度解剖dubbo源码---01dubbo的架构原理-探索.mp4

    02内核解剖-dubbo自己的SPI实现.mp4 https://blog.csdn.net/prestigeding/article/details/80795708 https://segment ...

  4. Django实现图片上传并前端页面显示

    Django实现图片上传和图片显示 开始之前我们先确认环境中已经安装了Pillow,如果没有安装,可以通过pip install Pillow来安装,这个是python的图像处理库 数据库设置 我们创 ...

  5. Spring系列.Bean简介

    Bean属性配置 Spring在读取配置文件中bean的metadata后会构造一个个BeanDefination对象.后面Spring会根据这些BeanDefinition创建对象.在配置一个bea ...

  6. Docker(六)容器数据卷

    容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 需求:数据可以持久化和同步 使用数据卷 指定路径挂载 docker run -it -v 主机目录:容器内目录 # 测试 [root@h ...

  7. 每日一题 - 剑指 Offer 49. 丑数

    题目信息 时间: 2019-07-03 题目链接:Leetcode tag:动态规划 小根堆 难易程度:中等 题目描述: 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求 ...

  8. JavaScript图形实例:再谈IFS生成图形

    在“JavaScript图形实例:迭代函数系统生成图形”一文中,我们介绍了采用迭代函数系统(Iterated Function System,IFS)创建分形图案的一些实例.在该文中,仿射变换函数W的 ...

  9. Netty 中的内存分配浅析-数据容器

    本篇接续前一篇继续讲 Netty 中的内存分配.上一篇 先简单做一下回顾: Netty 为了更高效的管理内存,自己实现了一套内存管理的逻辑,借鉴 jemalloc 的思想实现了一套池化内存管理的思路: ...

  10. 记一道CTF隐写题解答过程

      0x00 前言 由于我是这几天才开始接触隐写这种东西,所以作为新手我想记录一下刚刚所学.这道CTF所需的知识点包括了图片的内容隐藏,mp3隐写,base64解密,当铺解密,可能用到的工具包括bin ...