新学git,对git的reset操作总是怕狼怕虎的,这样是不对的,对于任何新鲜事物都要大胆去尝试。看几篇博客,看几页图书然后死记概念,永远也不能完全理解其中的道理。废话不多说,直接上货。
先看实例
```
mkdir git-reset
cd git-reset
git init
```
开始做几次提交
```
echo "Hello, git rest" > readme.txt
git add .
git commit -m 'first commit'
echo "new line" >> readme.txt
git add .
git commit -m 'second commit'
echo "third line" >> readme.txt
git add .
git commit -m 'third commit'
```
看下提交log
```
git log --graph --oneline
1. 33be59b third commit
2. ab56d39 second commit
3. c773001 first commit
```
当前提交的readme
```
cat readme.txt
Hello, git reset
a new line
the third line
```
## 1. 首先来看第一种reset模式, mixed,即其默认的模式。结果如下。
```
git reset HEAD^
Unstaged changes after reset:
M readme.txt
git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
git log --graph --oneline
* ab56d39 second commit
* c773001 first commit
```
看出什么了吗,git将提交回滚到了second commit, 同时清空了暂存区(也称stage或index,下文用stage代替暂存区),但是工作区仍然保留,所以git status时,显示时当前工作区相对于second commit的变动。使用这种模式不用害怕吧,他并不会清除你的工作区,你在third commit做的任何操作都不会消失。
## 2. 看另一种方式,soft模式
```
git reset --soft HEAD^
git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
```
看到了吧,采用这种模式,git不回清除你的stage区,因此,git status时就显示了stage区相对于second commit的变化。此时工作区是clean 的,而stage区则有变化。
## 3. 第三种方式 hard
```
git reset --hard HEAD^
HEAD is now at ab56d39 second commit
git st
On branch master
nothing to commit, working directory clean
cat readme.txt
Hello, git reset
a new line
```
这时工作区,stage区都是干净的,然而readme.txt则残忍的回到了第二次提交是的状态。这说明了啥,采用这种模式,git回用second commit 的内容覆盖stage区和工作区,因此所有的内容都回到了second commit的状态。
实例做完了,开始总结吧
>git reset –soft 不会改变stage区,仅仅将commit回退到了指定的提交
git reset –mixed 不回改变工作区,但是会用指定的commit覆盖stage 区,之前所有暂存的内容都变为为暂存的状态
git reset –hard 使用指定的commit的内容覆盖stage区和工作区。
总有后悔药,`git reset` 是`git`给我们的`commit`层级的回滚方式。
- 其他
- Git submodule 如何删除一个 submodule
- 解 git submodule 无映射路径的问题
- 删除分支
- git revert
- 基本命令
- git reset的三种模式
- ignore的使用
- git tag
- 用户相关
- 问题
- 重命名远程分支
- 注意事项
- GIT里设置大小写敏感
- 如何处理git每次提交都输入密码
- Git 工作流程
- 详细使用
- git 放弃更改
- 子模块儿
- 增加子模块儿
- 删除子模块儿
- 更新子模块儿
- 分支
- 分支(branch)操作
- git删除远程分支和本地分支
- 项目属于哪个分支
- 标签(tag)操作
- 命令
- branch
- remote
- clone
- tag
- log
- reflog
- diff
- reset
- merge
- push
- pull
- submodule
- 分支命名