git的撤销与重置操作

161 阅读5分钟

这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

前言

今天我们来复习一下Git的撤销和重置操作功能,我们一起来看看吧!

撤销与重置

特别是重置部分理解即可(用到了再去查),撤销尽量可以掌握

Ⅰ- 撤销

1、git commit --amend

  1. 这个命令会将暂存区中的文件提交,修订提交(不是撤销而是重新提交)

  2. 如果自上次提交以来你还未做任何修改(如:在上次提交后马上执行此命令),那么快照会保持不变,而你修改的只是提交信息

  3. 如果你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作

    git commit -m "错误的注释" #或者commit了错误的修改
    git add "文件名或者."  #重新add正确的文件
    git commit --amend      #进行重新提交
    

    最终你只会有一个提交 (第二次提交将会替代第一次提交)

  4. 可以修改上次提交的文件与注释

2、git reset

  1. 一般我们写完代码后,是这样提交的:

  • git add . //添加追踪所有文件

  • git commit -m "feat(前端-Git学习详细笔记):更新撤销commit操作" //添加commit提交信息

  1. 但是commit写完提交信息后,突然想到还有一个地方代码没改到/保存,如果放到下一个commit却不合适(同一个功能修改,分成两个commit),原因详见下方的 版本控制工具的使用基本原则

  2. 执行此命令命令:git reset --soft HEAD^

  • HEAD^的意思是上一个版本,也可以写成HEAD~1
  • 如果你进行了2次commit,想都撤回,可以使用HEAD~2
  • 详见下方 reset三部曲

作用:将文件从暂存区中撤回到工作目录中(仅仅是撤回commit操作,你写的代码仍然保留)

3、git checkout

是的,你没看错,这个是切换分支的命令,但是他也能用来撤销文件修改

命令:git checkout --文件名

将在工作目录中对文件的修改撤销

注意:这是一个危险的命令,这很重要.你对那个文件做的任何修改都会消失--你只是拷贝了另一个文件(原来版本的文件)来覆盖它.除非你确实秦楚不想要那个文件了,否则不要使用这个命令

Ⅱ - 重置reset

注意:--hard标记是reset命令唯一的危险用法,也是Git真正的销毁数据的几个仅有操作之一.其他任何形式的reset调用都可以轻松撤销,但是--hard选项不能,因为它强制覆盖了工作目录中的文件.

如在这种特殊情况:我们的Git数据库中的一个提交内还留有该文件的几个版本,我们可以通过reflog来找回它,但若是该文件还未提交,Git仍会覆盖他导致它无法恢复

reset三部曲

第一部:git reset --soft HEAD~(等于之前的--amend,后面如果跟随数字,就是回退几个版本,默认1个)

移动HEAD (但带着分支一起移动,与checkout不同(它只动HEAD)) -->相当于回到你没有 [ commit ]的时候,代码仍在

第二部:git reset --mixed HEAD~

移动HEAD 并且动了了暂存区

第三部:git reset --hard HEAD~

移动HEAD 并且动了了暂存区 动了工作目录 ( 你的提交的代码也会没掉 )

Ⅲ - 错误的git push提交成功后如何撤销回退

我们在使用Git进行版本控制时,有可能会出现这种情况。git push后发现提交的内容不是想要的,这时候我们怎么做呢,提交上去的内容是没有删除按钮的(比如github,或码云)。所以我们需要一些手段将提交上去内容撤销下来。

而要撤销,就要用到上面所学的 git reset

1、错误场景示范

Ⅰ- 当我撰写 [ commit ] 信息没注意到,以为是对的时候直接提交 --> 因为本人提交笔记时喜欢按 [ ↑ ] 找到之前的提交信息进行修改

Ⅱ- 此时可以看到,错误的 [ commit ] 已经提交了 (当然,适用场景不只是commit ,也可错误代码之类的)

image-20210813155746112

2、回退操作

咱们操作稳重一点,使用git reset --soft HEAD~就好了(如果回退后代码也不想要,可以用git stash,暂存,达到代码也回退的效果)

① git reflog

commits,它在git中扮演了一个重要角色,我们平常用的一些操作git clone ,git commit 都会产生commits,通俗的讲这个就是版本号,但是git reset并不会产生commits(不是不会产生,而是会产生 但是都是一样的),我们可以先看看自己项目中的commits,使用如下命令:git reflog

image-20210813154309057

② git reset --soft HEAD~

运行此代码后,我们的 [ HEAD ] 指向了上一个 [ commits ]

image-20210813154448889

③ 查看缓存
  • 此时你可以用stash staus查看,会发现,之前提交的代码已经放回缓存区了

  • 如果你不想要此次提交所有代码,可以使用git stash ,然后再去清空即可(当然,本人此处还是需要的,所以要留下)

    image-20210813154839981

④ 重新撰写 [ commit ]信息

image-20210813154928064

⑤ 强制提交

如果你重新撰写 [ commit ] 后马上重新push,你会发现无法提交: 因为我们当前落后远程一个版本!

所以此时直接强制提交即可,就能覆盖远程提交记录

git push -f

image-20210813155049169

3、成功展示

  • 在网站工作台首页能看到已经将更改后的 [ coommit ] 强制推送上来了

也许你会奇怪:为啥工作台上还能看到? 其实已经删了!!!你看下方

image-20210813155614570

  • 但是你查看提交记录,会发现之前错误的commit已经被覆盖

总结:git撤销与重置的操作在错误提交和推送方面是很有帮助的,所以大家多多理解,一步步来,加油!