撤消修改

撤消工作区的修改

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

Last updated