文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在 git 中提交后,如何撤销?

2024-12-01 13:00

关注

在 git 中撤消提交的最简单方法是使用 revert 选项:

git revert

这会撤销最近的提交。

包括使用 revert 在内,有两种方法可以撤销提交操作:

还原提交(revert)

如果只是想要撤销一个提交,但是不删除 git 日志,可以使用 git revert 命令。其语法为我们刚刚提到过的:

git revert

上述命令中的 可以是用于提交的任何名称,比如可以是在提交的 SHA1(提交时会得到这个值)、标记、引用名称或者其他任何唯一标识提交的东西。

我们来举个例子。首先在 git 中初始化一个文件:

$ git commit -m "init commit"
[master (root-commit) b1adf72] init commit
1 file changed, 3 insertions(+)
create mode 100644 ​​README.md​​
$ echo "a new line in readme" >> ​​README.md​​

使用 cat 命令来看一下这个文件的内容:

$ cat ​​README.md​​
Heading
A readme is useless if it is empty. But this readme is even more useless because it wastes the reader's time.
a new line in readme

然后我使用 git add . 将其添加到暂存区,再然后做一次提交(提交的文本为:a commit that will live on for ever):

$ git commit -m 'a commit that will live on for ever'
[master b731901] a commit that will live on for ever
1 file changed, 1 insertion(+)

这次提交,系统返回给我一个唯一标识(master b731901)。现在我们运行 git revert 并使用该唯一标识,来恢复到上一次提交的状态:

$ git revert master b731901
[master 01c9be7] Revert "a commit that will live on for ever"
1 file changed, 1 deletion(-)

然后我们来看一下 git 日志,检查撤销操作有没有反映在日志中:

$ git log commit 01c9be75eff7b5ae48c6c35bbb7c63ac1ebc3fcd (HEAD -> master) Author: Pratham Patel <​​pratham@itsfoss.com​​> Date: Mon Feb 28 21:29:36 2022 +0530

$ git log
commit 01c9be75eff7b5ae48c6c35bbb7c63ac1ebc3fcd (HEAD -> master)
Author: Pratham Patel <​​pratham@itsfoss.com​​>
Date: Mon Feb 28 21:29:36 2022 +0530
Revert "a commit that will live on for ever"
This reverts commit b731901deaa30851832c07b7cb7ed535b68d473d.
commit b731901deaa30851832c07b7cb7ed535b68d473d
Author: Pratham Patel <​​pratham@itsfoss.com​​>
Date: Mon Feb 28 21:29:12 2022 +0530
a commit that will live on for ever
commit b1adf72e535921ff966ff78f062943b717e78a08
Author: Pratham Patel <​​pratham@itsfoss.com​​>
Date: Mon Feb 28 21:20:43 2022 +0530
init commit

上述输出可以看出,git 日志记录了这次撤销,但是 README 文件已经被回复到先前的状态:

$ cat ​​README.md​​
Heading
A readme is useless if it is empty. But this readme is even more useless because it wastes the reader's time.

删除提交

如果想要彻底恢复错误的提交且不保留日志,可使用 git reset。

git 中的每次提交(commit) 都相当于是仓库的一个快照,另外,在 git 中有一个名为 HEAD 的引用变量--使用 git log 查看日志的时候就能看到。这个 HEAD 用于指向你正在工作的分支中的最近提交。

为了演示,我们首先更改一个文件:

$ git commit -m "init commit"
[master (root-commit) b1adf72] init commit
1 file changed, 3 insertions(+)
create mode 100644 ​​README.md​​
$ echo "a new line in readme" >> ​​README.md​​
$ cat ​​README.md​​
Heading
A readme is useless if it is empty. But this readme is even more useless because it wastes the reader's time.
a new line in readme

然后提交:

$ git add .
$ git commit -m "a commit that i will regret later on"
[master fb58caf] a commit that i will regret later on
1 file changed, 1 insertion(+)

然后使用 git reset 命令来撤销这次提交:

$ git reset --soft HEAD~1

接下来看下 git 日志:

$ git log
commit b1adf72e535921ff966ff78f062943b717e78a08 (HEAD -> master)
Author: Pratham Patel <​​pratham@itsfoss.com​​>
Date: Mon Feb 28 21:20:43 2022 +0530

可以看到,我们的上次提交(提交文本 a commit that I will regret later on)已经不见了。

由此可见,这个提交被完全被删除了,因为我将 HEAD 指向移动到了最后一个引用(用HEAD~1表示)。

这个删除操作并没有影响到我们的工作文件 ​​README.md​​:

$ git status
On branch master
Changes to be committed:
(use "git restore --staged ..." to unstage)
modified: ​​README.md​​

--soft 标志表示在运行 git reset 的时候修改的是 git 保存的日志。

如果想要将 git 存储库中的内容恢复到先前的状态,可使用 --hard 标志(不过要谨慎使用,确保需要的文件做好备份)。

来源:TIAP内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯