【Git 学习】深入理解git reset 命令

重置命令(git reset)是Git 最常用的命令之一,也是最危险最容易误用的命令。来看看git reset命令用法。

-----------------------------------------------------------------------------------------------------------

用法一:git reset [-q]  [<commit>] [--] <paths》.....

用法二:git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

-----------------------------------------------------------------------------------------------------------

上面列出了两个用法,其中<commit>都是可选项,可以使用引用或提交ID,如果省略<commit>则相当于使用了HEAD的指向作为提交ID.

上面列出的两种祖坟的区别在于,第一种用法在命令中包含路径<paths>.为了避免路径和引用(或者提交ID)同名而发生冲突,可以在<paths>前用两个连续的短线(减号)作为分隔。

第一种用法(包含了路径<paths>的用法)不会重置引用,更不会改变工作区,而是用指定提交状态(<commit>)下的文件(<paths>)替换掉暂存区中的文件。例如命令git reset HEAD <paths>相当于取消之前执行的git add <paths>命令时改变的暂存区。

第二种用法(不使用路径<paths>的用法)则会重置引用。根据不同的选项,可以对暂存区或工作区进行重置。参照下面的版本库模型图,来看一看不同的参数对第二种重置语法的影响。

使用参数 --hard, 如:git reset --hard <commit>.

会执行上图中的全部动作1,2,3,即:

1.替换引用的指向。引用指向新的提交ID.

2.替换暂存区。替换后,暂存区的内容和引用指向的目录树一致。

3.替换工作区。替换后,工作区的内容变得和暂存区一致,也和HEAD所指向的目录树内容相同。

使用参数 --soft, 如:git reset --soft <commit>.

会执行上图中的操作1。即只更改引用的指向,不改变暂存区和工作区。

使用参数 --mixed或不使用参数(默认为 --mixed),如:git reset <commit>.

会执行上图中的操作1和操作2.即更改引用的指向及重置暂存区,但是不改变工作区。

下面通过一些示例,看一下重置命令的不同用法。

命令:git reset

仅用HEAD指向的目录树重置暂存区,工作区不会受到影响,相当于将之前用git add命令更新到暂存区的内容撤出暂存区。引用也未改变,因为引用重置到HEAD相当于没有重置。

命令:git reset HEAD

同上

命令:git reset -- filename

仅将文件filename 的改动撤出暂存区,暂存区中其它文件不改变。相当于对命令git add filename 的反操作。

命令:git reset HEAD filename

同上

命令:git reset --soft HEAD^

工作区和暂存区不改变,但是引用向前回退一次。当对最新提交的提交说明或提交的更改不满意时,撤销最新的提交以便重新提交。

命令:git reset HEAD^

工作区不改变,但是暂存区会回退到上一次提交之前,引用也会回退一次。

命令:git reset --mixed HEAD^

同上

命令:git reset --hard HEAD^

彻底撤销最近的提交。引用回退到前一次,而且工作区和暂存区都会回退到上一次提交的状态。自行一次以来的提交全部丢失。

原文地址:https://www.cnblogs.com/xixiuling/p/10251077.html

时间: 2024-11-08 15:13:30

【Git 学习】深入理解git reset 命令的相关文章

【git学习一】git的原理

1.背景 git是比较流行的版本管理软件,博主才疏学浅,到目前为止只用过svn和git.虽然git也用了较长时间了,但是还是没有深入学习过,这周打算阅读Progit,对git有一个深入的总结,另外把git的一些主要命令总结下,方便日后学习工作中使用. 2.git简史 读了一遍Progit第一章节,印象比较深刻的有如下几点. 1.git的底层是数据库,这样我们就大体明白git的基本原理,把项目的快照按照编码存入数据库. 2.git的最早是由linux社区的开发者开发的,膜拜大神! 3.git的主要

【git学习二】git基础之git管理本地项目

1.背景 git基础打算分两部分来说,一部分是对于本地项目的管理,第二部分是对于远程代码仓库的操作.git执行本地项目管理包括对于相关文件的追踪,暂存区的比较分析,提交,撤销等功能. 2.本地项目管理 首先mkdir一个文件夹,叫做GitTestFile,然后执行下面代码,创建git的管理配置 git init 接着加入如下代码,git add . ,把项目加入跟踪队列 git add . 可以用git status查看状态 加入readme文件,vim readme.txt .输入git st

【git学习五】git基础之git分支

1.背景 最早用github的时候,我傻傻的问舍友大神,git里面的branch是干什么的,他用了很直白的解释,我至今还记得."branch就是你可以自己建立一个分支,随便乱搞而不影响整个项目".git分支应该是git最nb的特色吧,分支的建立和合并都十分方便. 大体的原理是这样的(图借用progit),比如说我们有一个master,还有一个分支是testing,git用head指针标记哪个分支正在被执行操作. 2.分支管理 首先来说下我们的现有的master,它是一个readme文件

使用git微命令深入理解git工作机制

首先,这篇不是真正意义上的翻译,所以大家在看的时候不要找对应的英文文章对应着看.这篇文章之所以归类为翻译,是因为最开始有一篇英文文章让我对git内部机制有了清楚的认识,它可以说是我git的启蒙老师吧.然后很久过去后,自己也有了很多的git项目实践,觉得有必要从自己的理解角度(微命令和常用命令对应分析)来整理下自己的理解,于是有了这篇博文. git是一种管理数据的工具,一种支持快速索引查找数据并管理数据变化的工具.它为数据添加一个头封装为对象块(本文称为git对象)然后保存为文件,并根据数据生成一

【git学习四】git基础之git为项目打标签

1.背景 今天学习了下如何给项目打标签,为此项目的修改标记版本号,然后可以直接推送版本号到服务器上,方便了很多,而且便于对项目进行管理. 2.打标签 1.查询已有标签,可以使用git tag命令,查询某个特定版本可以git tag -l 'v*' git tag 2.为版本创建标签 git tag -a v1.4 -m 'my version 1.4' 3.查看添加的标签,git show命令 git show 4.也可以对之前的某次commit加标签 git tag -a v1.2 9fceb

【git学习三】git基础之git管理远程仓库

1.背景 git管理远程仓库,本文以github为例. 2.管理远程仓库 1.本地ssh认证,在github建立一个repo叫做ospaf-GetWordFre 2.添加远程仓库,可以用git remote 命令实现,o是仓库名,可以用git remote -v查看 git remote add o git://github.com/jimenbian/ospaf-GetWordFre.git 3.接着就可以向github上fetch或是push代码了.注意要选择分支 /************

git学习------&gt;如何用git log命令来查看某个指定文件的提交历史记录

有时候接手一份新代码时,看到某些文件的改动,但不清楚这个改动的作者和原因,想查看该文件的具体提交历史记录. 今天一个同事是这样做的,直接敲git log命令,然后再使用vim命令的搜索关键字的方法来查看该文件的提交记录,如下所示: 例如:我想查看frameworks/base/packages/SystemUI/AndroidManifest.xml该文件的提交记录,敲了git log命令后,直接按"/"然后加入该文件的路径,后就可以搜索该文件名作为关键字,然后按N和Ctrl+N进行上

Git学习笔记2——Git版本库的创建

创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录: $ cd s: $ cd Git_Learing $ pwd s/Git_Learning pwd命令用于显示当前目录.在我的windows上,这个仓库位于s/Git_Learning. 在Windows系统中,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文. 第二步,通过git init命令把这个目录变成Git可以管理的仓库: $ git init Initialized empty Git reposi

[git学习:Pro git(2)]Git基础

Getting a Git Repository(取得项目的Git仓库) 一在工作目录中初始化新仓库: git init 初始化后,在当前目录下会出现一个名为.git的目录,所有Git需要的数据和资源都存放在这个目录下不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中任何一个文件. $git add *.c #git add 开始跟踪文件,begin to tracking a new file $git add README $git commit

Git学习6:Git冲突模拟与解决

在真实的Git运行环境中,往往涉及多个用户对版本仓库的协作,而每个用户都有一个完整的Git版本仓库副本,所以在把各自的操作结果推送到远程仓库的时候出现冲突的可能性就非常高. 在Git中解决冲突的一个优雅方式是:首先通过命令git fetch获取远程仓库最新的修改,然后执行命令git merge将本地的操作结果(实际上就是一个commit)与远程仓库的修改(远程仓库最新的commit)进行合并,如果在合并的过程没有发生冲突,那么Git会生成一个新的commit,并自动提交.但是,合并并非总是成功的