十、Git版本库中的撤销操作
1、撤销文件的修改
自从你上次将README.txt文件提交到版本库后,你又对README.txt做了很多修改,但是过了不久,你突然觉得有些地方改错了,或者不想保留这些修改了,不幸的是你又因为忘记到底改了哪些内容而无法手动恢复,咋办?这种情况在工作时经常会遇到,特别是在写代码的时候,一上头就干了半天,回过头发现全是废操!我TM要回去!
别怕,Git带你飞!在Git版本库中,所有的操作都是有记录的,也可以帮你光速恢复!
先在版本库中执行git status命令:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.txt
no changes added to commit (use "git add" and/or "git commit -a")
Git已经非常清楚地告诉你,git restore <file> 可以丢弃工作区的修改:
$ git restore README.txt
$ git status
On branch master
nothing to commit, working tree clean
可以看到那些修改已经被撤消了。
2、取消暂存的文件
这次你修改了两个文件并且想要将它们作为两次独立的修改提交, 但是却意外地输入 git add * 直接暂存所有的文件修改。如何将其中一个取消暂存呢?
先执行git status命令看下情况:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: Design/System A.docx
modified: README.txt
在 “Changes to be committed” 文字正下方,提示使用 git restore –staged <file> 来取消暂存。 所以,我们可以这样来取消暂存 README.txt文件:
$ git restore --staged README.txt
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: Design/System A.docx
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.txt
此时,可以看到README.txt文件已经出现在了“Changes not staged for commit”下面,表示未暂存。
3、覆盖上一次提交
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交。这个命令会将暂存区中的文件提交,并用新的提交信息覆盖上一次的提交信息。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而你所修改的只是提交信息。
例如,我们先执行git log查看提交信息:
$ git log --oneline
57c5b17 (HEAD -> master) 添加设计文档
aeb65f4 添加需求文档
2c97086 修改README.txt文件
a235818 添加readme文件
可以看到,上一次提交信息为:添加设计文档。
现在版本库中有一份文件,虽然已暂存了,但是还未提交,你想把它也放到上一次提交里面,作为一个记录存在版本库里。你就可以通过git commit --amend实现:
$ git commit --amend -m "添加设计文档2"
[master 1d7505f] 添加设计文档2
Date: Thu Sep 2 15:08:25 2021 +0800
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 Design/System A.docx
create mode 100644 Design/System B.docx
我们再执行git log查看下提交历史:
$ git log --oneline
1d7505f (HEAD -> master) 添加设计文档2
aeb65f4 添加需求文档
2c97086 修改README.txt文件
a235818 添加readme文件
可以看到,上一次提交信息已经被修改掉了,且没有产生新的提交记录。