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

简介:

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


在 Git 中,有三个命令可以用来撤销操作,分别是 git reset、git revert、git checkout。

背景知识

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

我们在工作区进行开发,然后通过 git add 将文件修改添加到暂存区,然后 git commit 提交更改,就把暂存区的所有内容提交到了当前分支的 Commit 历史中去了。

git revert

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

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

git reset

这个命令相对来说就要复杂一点了,它能够同时作用于 Commit 和文件,用来撤销还没有提交到远程仓库的改动。

对于 Commit 来说,git reset 会移动 HEAD 的位置,并且还可以变更暂存区和工作区,该操作有三个选项:

1.--soft:该选项会修改 HEAD 位置,而工作区和暂存区不会有变化

2.--mixed:默认选项,会修改 HEAD 位置以及暂存区,而工作区不会有变化

3.--hard:修改 HEAD 位置,暂存区和工作区都会被更新到指定 Commit 的状态

是不是有点绕,没关系我们实战说话:

1

现在,我们使用 git log 可以看到有三条 commit 记录,使用 git status 可以看到暂存区的状态为空。

接下来,我们使用 git reset HEAD~1 命令,然后我们再次使用 git log 和 git status 命令,可以看到 Commit 历史中,HEAD 的位置已经修改到了提交 b 的位置,同时在工作目录中我们还能找到 c 文件,并且 c 文件被移出了暂存区,这就是 mixed。

接下来,我们再次将 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 版本的状态,当你使用 git checkout -- 的时候就会撤销掉在工作区这个文件的修改。

对于这些操作,大家一定要注意,不要乱用,把仓库搞乱了就不好了。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-05-27
本文作者:小烜同学
本文来自:“掘金”,了解相关信息可以关注“掘金”

相关文章
|
7月前
|
开发工具 git
记IDEA Git版本回退并push到远程操作
记IDEA Git版本回退并push到远程操作
174 1
记IDEA Git版本回退并push到远程操作
|
7月前
|
开发工具 git 开发者
|
7月前
|
开发工具 git
web后端-IDEA的Git操作
web后端-IDEA的Git操作
|
7月前
|
Linux 网络安全 开发工具
Git拉取代码的完整示例操作
Git拉取代码的完整示例操作
334 0
|
6月前
|
开发工具 git
idea的git reset current branch to here操作详解
idea的git reset current branch to here操作详解
685 1
|
5月前
|
Ubuntu 开发工具 git
git 超实用教程【人人必会!】(含大厂的 git 操作规范)
git 超实用教程【人人必会!】(含大厂的 git 操作规范)
91 0
|
7月前
|
开发工具 git 开发者
【专栏】探讨了 Git 中的 `git rebase` 操作,它用于重新应用提交到另一分支,改变历史顺序
【4月更文挑战第29天】本文探讨了 Git 中的 `git rebase` 操作,它用于重新应用提交到另一分支,改变历史顺序。与 `git merge` 不同,rebase 重写提交历史,提供简洁线性的历史记录。文章介绍了 rebase 的基本操作、应用场景,如整理提交历史、解决冲突和整合分支,并强调了使用注意事项,如避免在公共分支上操作。尽管 rebase 可以带来整洁的历史和冲突解决便利,但其潜在的风险和可能导致的历史混乱需谨慎对待。理解并恰当使用 `git rebase` 可以提升开发效率和代码质量。
230 1
|
7月前
|
开发工具 git
|
7月前
|
开发工具 git 开发者
掌握常见Git操作:技巧与实践
掌握常见Git操作:技巧与实践

相关实验场景

更多