模拟面试官:Git 如何进行撤销操做?

在 Git 中,有三个命令能够用来撤销操做,分别是 git resetgit revertgit checkoutgit

背景知识

Git 仓库由三个部分组成,工做区、暂存区和 Commit 历史。安全

咱们在工做区进行开发,而后经过 git add 将文件修改添加到暂存区,而后 git commit 提交更改,就把暂存区的全部内容提交到了当前分支的 Commit 历史中去了。bash

git revert

该操做只能做用于 Commit,而不能做用于文件。同时,该操做会建立一个新的 Commit 来撤销以前提交的更改,它不会去修改现有的历史记录。spa

换句话说,这个命令是安全的,它不会丢失 Commit 记录,只会新增。code

git reset

这个命令相对来讲就要复杂一点了,它可以同时做用于 Commit 和文件,用来撤销尚未提交到远程仓库的改动。cdn

对于 Commit 来讲,git reset 会移动 HEAD 的位置,而且还能够变动暂存区和工做区,该操做有三个选项:blog

  1. --soft:该选项会修改 HEAD 位置,而工做区和暂存区不会有变化
  2. --mixed:默认选项,会修改 HEAD 位置以及暂存区,而工做区不会有变化
  3. --hard:修改 HEAD 位置,暂存区和工做区都会被更新到指定 Commit 的状态

是否是有点绕,不要紧咱们实战说话:开发

touch a
git add a
git commit 'feat: 添加 a 文件'
touch b
git add b
git commit 'feat: 添加 b 文件'
touch c
git add c
git commit 'feat: 添加 c 文件'
复制代码

如今,咱们使用 git log 能够看到有三条 commit 记录,使用 git status 能够看到暂存区的状态为空。string

接下来,咱们使用 git reset HEAD~1 命令,而后咱们再次使用 git loggit status 命令,能够看到 Commit 历史中,HEAD 的位置已经修改到了提交 b 的位置,同时在工做目录中咱们还能找到 c 文件,而且 c 文件被移出了暂存区,这就是 mixedit

接下来,咱们再次将 c 文件提交回去恢复成初始状态,此次咱们在命令后加上 --soft,咱们再来看,HEAD 的位置依然被修改了,而且工做区 c 文件依然存在,不一样的是 c 依然在暂存区中。

最后咱们加上 --hard 再来看一看,咱们能够发现,HEAD 变了,暂存区和工做区的 c 文件都被移除了,这个参数比较危险,也就不建议你们在公共分支上进行操做了。

说完了 Commit,那文件是如何撤销的呢?对于文件来讲,上面提到的三个参数是不起做用的,它会去更新暂存区的对应文件到指定 Commit 的时候的版本。

仍是上面的例子,若是我使用命令 git reset HEAD~1 c,会出现什么结果呢?你们能够想想,答案是,它会将 c 文件更新到上一个 Commit 的时候的版本,也就是尚未被建立的状态,因此你执行 git status 能够发现暂存区中存在 delete: c,这就是文件的撤销。

git checkout

当你 checkout Commit 的时候,会将 HEAD 指向你指定的 Commit,而且这个没有分支指向这个 HEAD,因此 checkout 以后,会处于一个 detached HEAD 的分支,若是你要提交 Commit 到这个分支,你应该先 checkout 一个分支出来,而后再进行提交。

当你 checkout 文件的时候,checkout 命令和 reset 就有点相似,可是它不会更新暂存区,只会更新工做区,当你使用 git checkout <commit> <filename> 的时候,就会把工做区的对应文件更新到指定 Commit 版本的状态,当你使用 git checkout -- <filename> 的时候就会撤销掉在工做区这个文件的修改。

对于这些操做,你们必定要注意,不要乱用,把仓库搞乱了就很差了。

很是感谢您的阅读,欢迎关注、转发、分享支持我。

相关文章
相关标签/搜索