这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战
前言
今天我们来复习一下Git的撤销和重置操作功能,我们一起来看看吧!
撤销与重置
特别是重置部分理解即可(用到了再去查),撤销尽量可以掌握
Ⅰ- 撤销
1、git commit --amend
这个命令会将暂存区中的文件提交,修订提交(
不是撤销而是重新提交)如果自上次提交以来你还未做任何修改(如:在上次提交后马上执行此命令),那么快照会保持不变,而你修改的只是提交信息
如果你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作
git commit -m "错误的注释" #或者commit了错误的修改 git add "文件名或者." #重新add正确的文件 git commit --amend #进行重新提交最终你只会有一个提交 (第二次提交将会替代第一次提交)
可以修改上次提交的文件与注释
2、git reset
一般我们写完代码后,是这样提交的:
git add . //添加追踪所有文件
git commit -m "feat(前端-Git学习详细笔记):更新撤销commit操作" //添加commit提交信息
但是commit写完提交信息后,突然想到还有一个地方代码没改到/保存,如果放到下一个commit却不合适(同一个功能修改,分成两个commit),原因详见下方的 版本控制工具的使用基本原则
执行此命令命令:
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 ,也可错误代码之类的)
2、回退操作
咱们操作稳重一点,使用git reset --soft HEAD~就好了(如果回退后代码也不想要,可以用
git stash,暂存,达到代码也回退的效果)
① git reflog
commits,它在git中扮演了一个重要角色,我们平常用的一些操作git clone ,git commit 都会产生commits,通俗的讲这个就是版本号,但是git reset并不会产生commits(不是不会产生,而是会产生 但是都是一样的),我们可以先看看自己项目中的commits,使用如下命令:
git reflog
② git reset --soft HEAD~
运行此代码后,我们的 [ HEAD ] 指向了上一个 [ commits ]
③ 查看缓存
此时你可以用
stash staus查看,会发现,之前提交的代码已经放回缓存区了如果你不想要此次提交所有代码,可以使用
git stash,然后再去清空即可(当然,本人此处还是需要的,所以要留下)
④ 重新撰写 [ commit ]信息
⑤ 强制提交
如果你重新撰写 [ commit ] 后马上重新push,你会发现无法提交: 因为我们当前落后远程一个版本!
所以此时直接强制提交即可,就能覆盖远程提交记录
git push -f
3、成功展示
- 在网站工作台首页能看到已经将更改后的 [ coommit ] 强制推送上来了
也许你会奇怪:为啥工作台上还能看到? 其实已经删了!!!你看下方
- 但是你查看提交记录,会发现之前错误的commit已经被覆盖