git的几个常用基本操作
需求一:如何把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 dir
中a.txt
文件还原成了stage
中的状态(一个空文件)。
当然,如果work dir
中被修改的文件很多,可以使用通配符全部恢复成stage
:
$ git checkout .
有一点需要指出的是,checkout
命令只会把被「修改」的文件恢复成stage
的状态,如果work dir
中新增了新文件,你使用git checkout .
是不会删除新文件的。
需求二:比如说commit
完之后,突然发现一些错别字需要修改,又不想为改几个错别字而新开一个commit
到history
区
那么就可以使用下面这个命令:
$ git commit --amend
这样就是把错别字的修改和之前的那个commit
中的修改合并,作为一个commit
提交到history
区。
需求三:将history区的文件还原到stage区
这个需求很常见,比如说我用了一个git add .
一股脑把所有修改加入stage
,但是突然想起来文件a.txt
中的代码我还没写完,不应该把它commit
到history
区,所以我得把它从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.txt
从stage
区还原出来呢?可以使用 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 dir
和stage
中所有的「修改」都会被撤销,恢复成HEAD
指向的那个history commit
。
注意,类似之前通过stage
恢复work dir
的checkout
命令,这里撤销的也只是修改,新增的文件不会被撤销。
当然,只要找到任意一个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
比如reset
,checkout
等等关键操作都会在这里留下记录,所有commit
的 Hash 值都能在这里找到,所以如果你发现有哪个commit
突然找不到了,一定都可以在这里找到。
git的几个常用基本操作的更多相关文章
- MatplotLib常用基本操作
本文记录matlibplot常用基本操作,都是基本功能,不涉及复杂联合操作,其中各用法详细用法可参考官网: 1. 基本画图操作 ##mofan_matplotlib.pyplot import mat ...
- 图解git中的最常用命令
图解git中的最常用命令 Git命令参考手册(文本版) git init # 初始化本地git仓库(创 ...
- git日常使用的常用命令总结
git日常使用的常用命令总结 git 是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常 ...
- git的下载安装以及基本操作
版权声明:本文为CSDN博主「~李疆」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.转载原文链接:https://blog.csdn.net/qq_403232 ...
- 版本控制-Git服务器搭建和常用命令使用
Git是目前世界上最先进的分布式版本控制系统(没有之一).使用Svn的请参考<版本控制-svn服务器搭建和常用命令(centos 6.3)>,下面介绍Git的常用命令 常用命令 简单版 升 ...
- Git 基本概念及常用命令
一.基本概念 文件的三种状态:(任何一个文件在git中都有以下三种状态) 1) 已提交(committed):表示该文件已经被安全地保存在本地数据库中了. 2) 已修改(modified):表示修改了 ...
- git开发流程、常用命令及工具、TortoiseGit使用及常见问题
根据我最近使用git的一些经历,git是基于分支的版本控制工具,分支有远程分支和本地分支. 一.开发流程 - 从远程服务器的master,clone一份项目文件到本地,然后本地master的基础上br ...
- Git基础知识与常用命令
一:相关概念: 1:工作区(Working Directory): 就是你在电脑里能看到的目录 2:版本库(Repository): 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. ...
- Git的配置及常用命令
Git配置 git config --global user.name "<username>" git config --global user.email &quo ...
随机推荐
- Beta冲刺--冲刺总结
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 Beta冲刺--冲刺总结 作业正文 如下 其他参考文献 ... Beta冲刺 ...
- Docker(五)Docker镜像讲解
Docker镜像讲解 镜像概念 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 Dock ...
- Python实用笔记 (1)字符串与编码
历史:Ascll-Unicode-UTF-8 对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符: >>> ord('A') ...
- 三.接收并处理请求参数与QueryDict对象
一.get与post请求:重点看传参与接收参数 GET请求与传参 ---->url后面跟上?k1=v1&&k2=v2 POST请求与数据提交 (1)get请求:如直接在浏览 ...
- Spring中AOP相关的API及源码解析
Spring中AOP相关的API及源码解析 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring ...
- 硬刚 lodash 源码之路,_.chunk
前置 chunk 函数内部借助其他函数实现,所以从其他函数开始,chunk 在最后. 你可能需要一些 JavaScript 基础知识才能看懂一些没有注释的细节. isObject 判断是否为 Obje ...
- 特殊方格棋盘【状压DP】
特殊方格棋盘[状压DP] 讲真状压DP这个东西只不过是有那么亿丢丢考验心态罢了(确信) 先从板子题说起,另加一些基础知识 题目描述 在的方格棋盘上放置n 个车,某些格子不能放,求使它们不能互相攻击的方 ...
- 列拖拽顺序调整-sortable.js使用
最近在做一个单表统计功能,涉及到一个查询列配置,但是查询出来的列顺序,可以进行配置,通过写列的排序当然阔以,但是方法就不美丽了.所以,在网上搜了一下拖拽的组件,最终定位Sortable.js,简单易用 ...
- JZOJ2018提高组-测绘
测绘 题目大意 为了研究农场的气候, \(Betsy\) 帮助农夫 \(John\) 做了 \(N(1 <= N <= 100)\) 次气压测量并按顺序记录了结果 \(M_1...M_N( ...
- [NOI Online #2 提高组]涂色游戏 题解
题目描述 你有 1020 个格子,它们从 0 开始编号,初始时所有格子都还未染色,现在你按如下规则对它们染色: 编号是 p1 倍数的格子(包括 0号格子,下同)染成红色. 编号是 p2 倍数的格子染成 ...