API使用介绍

git restore <filename>撤销 工作区的内容
git restore --staged <filename> 撤销 暂存区的内容回退到工作区

案例演示

演示从暂存区撤销内容

创建一个项目,新建readme.txt文件。新建readme.txt文件

  1. # log查看提交历史记录,进行了4次提交
  2. shuais-MacBook-Pro:restore shuai$ git log --oneline
  3. d9531bd (HEAD -> master) add file
  4. 4cff528 v3
  5. bdaa5d3 v2
  6. 2688ed0 v1

然后又在readme.txt文件中增加一行

  1. # 1.对文件readme新增一行内容,这是错误内容。操作目的是从暂存区撤销,并在本地也撤销
  2. shuais-MacBook-Pro:restore shuai$ echo "this is wrong! " >> readme.txt
  3. # 2.将内容添加到暂存区。【因为这时还不知道是错的内容】
  4. shuais-MacBook-Pro:restore shuai$ git add .
  5. # 3.查看文件状态,以及提交到了暂存区
  6. shuais-MacBook-Pro:restore shuai$ git status
  7. On branch master
  8. Changes to be committed:
  9. (use "git restore --staged <file>..." to unstage)
  10. modified: readme.txt
  11. # 4.通过restore --staged可以将暂存区内容回退到工作区
  12. shuais-MacBook-Pro:restore shuai$ git restore --staged .
  13. # 5.查看文件状态,已经把添加的错误内容退回到了工作区
  14. shuais-MacBook-Pro:restore shuai$ git status
  15. On branch master
  16. Changes not staged for commit:
  17. (use "git add <file>..." to update what will be committed)
  18. (use "git restore <file>..." to discard changes in working directory)
  19. modified: readme.txt
  20. no changes added to commit (use "git add" and/or "git commit -a")
  21. # 6. 将工作区的内容撤销
  22. shuais-MacBook-Pro:restore shuai$ git restore .

演示从仓库中撤销内容

仓库分为本地仓库和远程仓库,撤销本地仓库相对还比较简单些。

撤销本地仓库内容,

可以使用reset命令。

  1. shuais-MacBook-Pro:restore shuai$ echo "this is wrong! " >> readme.txt
  2. shuais-MacBook-Pro:restore shuai$ git add .
  3. shuais-MacBook-Pro:restore shuai$ git commit -m "add wrong content"
  4. [master cda7c9b] add wrong content
  5. 1 file changed, 1 insertion(+)
  6. shuais-MacBook-Pro:restore shuai$ git status
  7. On branch master
  8. nothing to commit, working tree clean
  9. shuais-MacBook-Pro:restore shuai$ git log --oneline
  10. cda7c9b (HEAD -> master) add wrong content
  11. d9531bd add file
  12. 4cff528 v3
  13. bdaa5d3 v2
  14. 2688ed0 v1
  15. # 使用reset 默认参数【--mixed】,可以回退暂存区和本地仓库内容,这样还可以在工作区继续修改编辑
  16. # 也可使用--soft参数,只回退暂存区内容
  17. # 也可使用--hard参数,同时回退工作区,暂存区,本地仓库的内容。把修改的内容全部清空回退,无法再次编辑
  18. shuais-MacBook-Pro:restore shuai$ git reset HEAD^
  19. Unstaged changes after reset:
  20. M readme.txt

查看工作区、暂存区、本地仓库的差异

  1. # 工作区和暂存区差异
  2. shuais-MacBook-Pro:restore shuai$ git diff readme.txt
  3. diff --git a/readme.txt b/readme.txt
  4. index 641d574..0d15209 100644
  5. --- a/readme.txt
  6. +++ b/readme.txt
  7. @@ -1,3 +1,4 @@
  8. 111
  9. 222
  10. 333
  11. +this is wrong!
  12. # 暂存区和本地仓库无差异
  13. shuais-MacBook-Pro:restore shuai$ git diff --cached readme.txt
  14. # 工作区和本地仓库的差异
  15. shuais-MacBook-Pro:restore shuai$ git diff HEAD readme.txt
  16. diff --git a/readme.txt b/readme.txt
  17. index 641d574..0d15209 100644
  18. --- a/readme.txt
  19. +++ b/readme.txt
  20. @@ -1,3 +1,4 @@
  21. 111
  22. 222
  23. 333
  24. +this is wrong!

说明使用git reset HEAD命令回退了暂存区和本地仓库的内容,将修改内容退回到工作区。

撤销远程仓库内容

操作远程仓库的撤销,最好使用revert回滚操作,这个操作可以新增一次commit提交记录,以免后边出现问题,能够进行查看修复。
使用reset回退操作,会把以前的提交commit记录给重置掉,且不会新增commit提交记录。该操作之后进行push操作无法正常进行,如果一定要同步远程仓库内容,可以使用git push -f强制操作。但是注意⚠️,该操作只能作用在自己的分支中,对公共分支进行此操作后,会造成其它人无法更新代码。

restore、reset、checkout对比

checkout 回退文件用法

git checkout -- <filename> 丢弃工作区的内容,并将最近一次commit内容回退到工作区。
git checkout HEAD^ -- <filename> 将本地仓库中指定commit记录的内容还原到当前工作区。
git checkout <branchname> -- <filename> 将指定分支的指定提交commit记录的内容还原到当前分支工作区

restore用法

git restore <filename>撤销 工作区的内容
git restore --staged <filename> 撤销 暂存区的内容回退到工作区

reset 用法

git reset HEAD:回退暂存区和本地仓库的内容,将这2个部分的内容退回上一个commit的记录
git reset --hard HEAD:回退本地仓库、暂存区、工作区的内容,将3个部分的内容都进行回退。

git checkout .命令和 git restore .命令的效果一样,都是撤销工作区内容的修改。