敞开成长之旅!这是我参加「日新计划 12 月更文挑战」的第35天,点击检查活动详情
懊悔药-怎样吊销改变?
发现写错了要回退怎样办?看看下面几种懊悔指令吧!
- ❓还没提交的怎样吊销? ——
checkout
、reset
- 还未提交的修正(作业区、暂存区)不想要了,用签出指令(checkout)进行吊销铲除。
- 或许用
checkout
的新版回滚指令reset
。
- ❓已提交但么有push的提交怎么吊销?——
reset
、revert
- ❓已push的提交怎么吊销?—— 同上,先本地吊销,然后强制推送
git push origin -f
,⚠️留意慎用! 记住先pull
获取更新。
懊悔指令
指令 | 描述 |
---|---|
git checkout . | 吊销作业区的(未暂存)修正,把暂存区康复到作业区。不影响暂存区,假如没暂存,则吊销一切作业区修正 |
git checkout [file] | 同上,file 指定文件 |
git checkout HEAD . | 吊销作业区、暂存区的修正,用HEAD 指向的当时分支最新版别替换作业区、暂存区 |
git checkout HEAD [file] | 同上,file 指定文件 |
git reset | 吊销暂存区状况,同git reset HEAD ,不影响作业区 |
git reset HEAD [file] | 同上,指定文件file ,HEAD 可省掉 |
git reset [commit] | 回退到指定版别,清空暂存区,不影响作业区。作业区需要手动git checkout 签出 |
git reset –soft [commit] | 移动分支master 、HEAD 到指定的版别,不影响暂存区、作业区,需手动git checkout 签出更新 |
git reset –hard HEAD | 吊销作业区、暂存区的修正,用当时最新版 |
git reset –hard HEAD~ | 回退到上一个版别,并重置作业区、暂存区内容。 |
git reset –hard [commit] | 回退到指定版别,并重置作业区、暂存区内容。 |
git revert[commit] | 吊销一个提交,会用一个新的提交(原提交的逆向操作)来完结吊销操作,假如已push 则从头push 即可 |
-
git checkout .
、git checkout [file]
会铲除作业区中未添加到暂存区的修正,用暂存区内容替换作业区。 -
git checkout HEAD .
、git checkout HEAD [file]
会铲除作业区、暂存区的修正,用HEAD指向的当时分支最新版别替换暂存区、作业区。
# 只吊销作业区的修正(未暂存)
$ git checkout .
Updated 1 path from the index
# 吊销作业区、暂存区的修正
$ git checkout HEAD .
Updated 1 path from f951a96
回退版别reset
reset
是专门用来吊销修正、回退版别的指令,支撑的场景比较多,多种吊销姿势,所以参数组合也比较多。简略理解便是移动master
分支、HEAD
的“指针”地址,理解这一点就根本把握reset
了。
如下图:
- 回退版别
git reset --hard v4
或git reset --hard HEAD~2
,master
、HEAD
会指向v4
提交,v5
、v6
就被废弃了。 - 也可以从头康复到
v6
版别:git reset --hard v6
,便是移动master
、HEAD
的“指针”地址。
reset
有三种形式,对应三种参数:mixed
(默许形式)、soft
、hard
。三种参数的主要差异便是对作业区、暂存区的操作不同。
-
mixed
为默许形式,参数可以省掉。 - 只有
hard
形式会重置作业区、暂存区,一般用这个形式会多一点。
形式名称\ | 描述 | HEAD的位置 | 暂存区 | 作业区 |
---|---|---|---|---|
soft | 回退到某一个版别,作业区不变,需手动git checkout
|
修正 | 不修正 | 不修正 |
mixed(默许) | 吊销暂存区状况,不影响作业区,需手动git checkout
|
修正 | 修正 | 不修正 |
hard | 重置未提交修正(作业区、暂存区) | 修正 | 修正 | 修正 |
络绎前,用git log
可以检查提交前史,以便确认要回退到哪个版别。要重返未来,用git reflog
检查指令前史,以便确认要回到未来的哪个版别。
git reset [--soft | --mixed | --hard] [HEAD]
# 吊销暂存区
$ git reset
Unstaged changes after reset:
M R.md
# 吊销作业区、暂存区修正
$ git reset --hard HEAD
# 回退版别库到上一个版别,并重置作业区、暂存
$ git reset --hard HEAD~
# 回到原来的版别(康复上一步的吊销操作),并重置作业区、暂存
$ git reset --hard 5f8b961
# 检查一切前史提交记载
$ git reflog
ccb9937 (HEAD -> main, origin/main, origin/HEAD) HEAD@{0}: commit: 报表新增导入功能
8f61a60 HEAD@{1}: commit: bug:修复报表导出bug
4869ff7 HEAD@{2}: commit: 用户报表模块开发
4b1028c HEAD@{3}: commit: 财务报表模块开发完结
吊销提交revert
安全的吊销某一个提交记载,根本原理便是出产一个新的提交,用原提交的逆向操作来完结吊销操作。留意,这不同于reset
,reset
是回退版别,revert只是用于吊销某一次前史提交,操作是比较安全的。
如上图:
- 想吊销
v4
的修正,履行git revert v4
,会发生一个新的提交v-4
,是v4
的逆向操作。 - 一起更新
maser
、HEAD
“指针”位置,以及作业区内容。 - 假如已
push
则从头push
即可。
# revert吊销指定的提交,“-m”附加说明
$ git revert 41ea42 -m'吊销对***的修正'
[main 967560f] Revert "123"
1 file changed, 1 deletion(-)
checkout/reset/revert总结
标题 \ 指令 | checkout | reset | revert |
---|---|---|---|
主要作用(吊销) | 吊销作业区、暂存区未提交修正 | 回退版别,重置作业区、暂存区 | 吊销某一次提交 |
吊销作业区 | git checkout [file] | git reset HEAD [file] | |
吊销作业区、暂存区 | git checkout HEAD [file] | git reset –hard HEAD [file] | |
回退版别 | git reset –hard [commit] | ||
安全性 | 只针对未提交修正,安全 | 如回退了已push 提交,不安全
|
安全 |
可看出reset
完全可以代替checkout
来履行吊销、回退操作,reset
原本也是专门用来干这个工作的,可以扔掉checkout
了(吊销的时分)。
参考资料
- 博客园 | 浅显易懂Git教程
- 山公都能懂的GIT入门
- 廖雪峰的GIT教程
- 电子书《ProGit-Git教程》
- Gitee码云的 Git 大全,真的挺全
- 灵敏进程实践-git代码分支办理规范
- 易百教程-Git教程?
- 在线Git学习+练习
- GUI Clients Git网站上的GUI工具列表
- Git常用指令调集
️版权声明:版权一切@安木夕,本文内容仅供学习,欢迎指正、交流,转载请注明出处!