git reset¶
git reset命令用于将当前HEAD复位到指定状态或用指定commit中的文件快照恢复暂存区中的文件.
一般用于撤销之前的一些操作, 如git add, git commit等.
注解
下面这一段是一个牛人的解释:
总的来说,git reset命令是用来将当前branch重置到另外一个commit的, 而这个动作可能会将index以及work tree同样影响.
相关的基本概念¶
先来看几个基本的概念:
HEAD- 一个特殊的分支指针, 指向某一个分支, 表示当前分支(或者说当前commit);
HEAD可以在不同的分支的不同commit之间切换.
分支- 一个分支其实就是一个指针, 指向一个commit; 分支指针可以在该分支的历史中移动, 指向不同的commit(分支指针只能指向固定的一个分支).
Indexindex也被称为staging area, 是指一整套即将被下一个提交的文件集合.
Working Copy- 表示正在工作的那个文件集.
重置HEAD和分支指针到指定的状态¶
# 将HEAD和branch重置到指定的commit状态
git reset [<commit>]
需要注意, git reset和git checkout是不一样的:
git checkout只改变HEAD的指向, 使其指向不同的branch;git reset使HEAD重置到某个commit的状态, 同时使分支指针也重置到该commit状态.
假设有如下的master分支, 图形化表示如下:
开始时, master和HEAD都指向ID为a349c9的commit.
如果我们执行:
git reset HEAD
什么事都不会发生, 这是因为我们告诉git重置这个分支到HEAD指向的commit, 而这个正是它现在所在的位置.
git reset HEAD~1
上面的命令表示将当前分支master和HEAD重置到HEAD之前的那个commit, 即f9ad39.
注解
HEAD 表示当前指向的那个commit;
HEAD~1或HEAD^表示当前指向的那个commit的前一个commit;
HEAD~2或HEAD^^表示当前指向的那个 commit*的前一个commit的前一个commit;
HEAD~N一次类推.
参数¶
--soft--soft参数表示将HEAD和branch重置到指定的commit, 但是index和working copy都不会有任何变化, 所有的original HEAD和重置到的那个 commit之间的所有差异都放在stage(index)区域中.--hard--hard参数会将HEAD和branch重置到指定的commit, 同时index和working copy也会重置到一样的状态. 这是一个比较危险的动作, 具有破坏性, 数据因此可能会丢失.如果我们希望丢掉
working copy和index中的修改而又不希望更改HEAD和branch所指向的commit, 可以执行:git reset --hard HEAD
或
git reset --hard
另一个使用场景是简单地移动
branch从一个到另一个commit, 同时保持index/working area的同步.--mixed(default)--mixed是reset的默认参数, 也就是当不指定任何参数时的参数. 它将重置HEAD和branch到指定的commit, 并且重置index但是不会更改working copy.所有该
branch上从original HEAD到重置到的那个commit之间的所有修改, 以及暂存区相对工作区之间的修改, 都将作为local modifications保存在working area中(被标示为local modification or untracked viagit status), 但是并未staged的状态, 可以重新检视然后再修改和提交.
git reset和git checkout的区别¶
git reset是将HEAD和branch重置到指定的commit, 根据参数的不同, 还可能重置index和working copy.
git checkout是切换HEAD指向指定的commit,
用指定commit中的文件快照恢复暂存区中的文件状态¶
git reset commit <file> ...