1.git reset的目的
(1)git reset操作可以使得当前的分支指向某一个提交。
(2)为了避免丢失本地的修改以及original HEAD,建议在进行reset操作之前,在本地创建一个新的branch,在新的branch上面进行reset,以保证master分支永远处于original HEAD。
2.Definitions
首先,为了讲解git reset的命令之谜,我们先来看一下下面几个名词的定义
HEAD(头)
指向当前branch最顶端的一个commit,该分支上一次commit后的节点
官方是如此解释的:
The index, also known as the staging area, is the set of files that will become the next commit. It is also the commit that will become HEAD’s parent.
Index(索引)
The index, 也可以被认为是staging area(暂存区), 也就是git add . 命令将本地修改提交到暂存区,暂存区等待下一次commit提交到,提交之后它就是 HEAD的父节点.
官方的解释:
The index, also known as the staging area, is the set of files that will become the next commit. It is also the commit that will become HEAD’s parent.
Working Copy(工作副本)
简单的来说就是在当期编译器或者工作目录下的未提交到暂存区的修改,(译注:一般指,有修改,但是没有git add与git commit的文件)
官方解释:
This is the term for the current set of files you’re working on in your file system.
index,HEAD,Working Copy的切换
(1)当执行git checkout -b 命令新建一个分支,HEAD指向该分支的最近一次的commit。
此时: 本分支的内容与 index和working copy是一样一样的
当你第一次checkout一个新的分支,HEAD指向该分支上最近一次commit。它和index和working copy是一样一样的。
(2)在本地做了文件修改,git会检测到“哦,有些东西被改了”,此时 working copy将与index与HEAD的内容不一样了。
注意:git会在你修改后标记这些文件。
(3)执行 git add 命令,会将本修改的文件提交到暂存区 index中, 此时 你的working copy和index相同,但是他们与本地HEAD指向的分支内容又不一样了
(4)执行git commit,本地新建了一个commit,HEAD指向这个最新的commit,此时 HEAD中的内容与working copy和index相同了
(5)执行git push ,将本地的提交push到远程仓库。
3.Reset命令
正如上面说的,git reset的操作是将当前的HEAD(当前分支的最近的一个提交)指向另外一个提交。
比如我们有下面这个本地分支:HEAD指向最顶端的一个提交
如果执行:
> git reset HEAD
这个时候git 什么都不做。因为他的意思是让当前分支指向HEAD,但是当前分支原本就是指向HEAD的。
如果执行:
> git reset HEAD~1
(HEAD~1 的意思是 “the commit right before HEAD”,接下来我们的分支中的HEAD指向最顶端的下面一个提交:
同理:
> git reset HEAD~2
分支如下:
(4)Parameters
reset命令本身很简单,但是它的参数让人迷惑,主要的参数有soft
, hard
and mixed,它们告诉Git,当执行reset时,要对index和working copy做什么。
git reset --Parameter HEAD~
Soft
The --soft
参数只告诉Git将HEAD重置到其他的commit。HEAD之前指向的分支中未提交的index和working copy中的内容都会保留。他们会等待下一次的git Push
Mixed (default)
The --mixed
会同时改变HEAD和index,此时index与HEAD指向的commit中的内容相同,index被重置。而HEAD之前指向的分支中的working copy文件会被保留下来。当然会显示工作目录下有修改,但没有缓存到index中。坐等下次的git add 与git commit
Hard(危险指令)
The --hard
HEAD & index & working copy同时改变到你要reset到的那个commit上。这个参数很危险,执行了它,你的本地修改就丢失了。