# 撤消修改

## 撤消工作区的修改

假设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
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://pshizhsysu.gitbook.io/git/ben-di-cang-ku/ban-ben-guan-li/che-xiao-xiu-gai.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
