> For the complete documentation index, see [llms.txt](https://pshizhsysu.gitbook.io/git/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://pshizhsysu.gitbook.io/git/ben-di-cang-ku/ban-ben-guan-li/che-xiao-xiu-gai.md).

# 撤消修改

## 撤消工作区的修改

假设learngit仓库下有一个readme.txt文件，内容如下

```
$ cat readme.txt
git is a version control system
git is free software
```

编辑readme.txt文件，添加一行内容，如下

```
$ cat readme.txt
git is a version control system
git is free software
append a new line
```

然后，我们查看状态

```
$ 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")
```

\`Changes are not staged for commit:\`说明工作区有了修改，却没有添加(statged)到暂存区

\`modified: readme.txt\` 说明修改的文件为readme.txt

接下来，我们使用命令来撤消工作区中的修改

```
$ git checkout -- readme.txt
```

然后，我们再用\`git status\`命令来查看状态

```
$ git status
# On branch master
nothing to commit, working directory clean
```

可以看出，工作区是干净的(working directory is clean)，即工作区的修改已经被撤消了

## 撤消暂存区的修改

假设learngit仓库下有一个readme.txt文件，内容如下

```
$ cat readme.txt
git is a version control system
git is free software
```

编辑readme.txt文件，添加一行内容，如下

```
$ cat readme.txt
git is a version control system
git is free software
append a new line
```

然后，把修改添加到暂存区

```
$ git add readme.txt
```

此时，查看状态

```
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   readme.txt
#
```

\`Changes to be committed:\` 说明修改已经添加到暂存区了，等待被commit

接下来，执行\`git reset HEAD\`命令来撤消暂存区的修改，**重新放回工作区**

```
$ git reset HEAD readme.txt
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")
```

此时修改已经回退到工作区了，如果要继续撤消工作区的修改，则按照上面的步骤完成即可

## 版本回退

首先，我们对readme.txt进行两次提交，第一次是创建readme.txt文件并添加前两行内容，第二次是在文件尾部再添加一行内容。

查看文件内容，如下

```
$ cat readme.txt 
git is a version control system
git is free software
append a new line
```

查看提交历史记录

```
$ git log --pretty=oneline
a6f3333f4ac325f35cc01c8127b0338263448ef3 append a new line
1bed8c6738c83569df624b86888718be9f1580f6 add readme.txt
```

最前面的长字符串是每一次提交的一个hash值。可以看出，有两次提交，且第一次提交的message为"add readme.txt"，说明第一次提交是创建并初始化了readme.txt文件；第二次提交是追加了第三行。

接下来，我们让版本回退到第一次提交后的状态，执行以下命令即可

```
$ git reset --hard 1bed8c
HEAD is now at 1bed8c6 add readme.txt
```

注意，回退到某个版本并不需要把那次提交的hash值写完，一般前六位就够了。

然后，我们再查看readme.txt的内容，已经是第一次提交后的内容了

```
$ cat readme.txt
git is a version control system
git is free software
```

此时，我们再来查看提交记录，发现已经只有一次提交了

```
$ git log --pretty=oneline
1bed8c6738c83569df624b86888718be9f1580f6 add readme.txt
```
