敞开成长之旅!这是我参加「日新计划 12 月更文挑战」的第35天,点击检查活动详情

懊悔药-怎样吊销改变?

发现写错了要回退怎样办?看看下面几种懊悔指令吧!

  • 还没提交的怎样吊销? —— checkoutreset
    • 还未提交的修正(作业区、暂存区)不想要了,用签出指令(checkout)进行吊销铲除。
    • 或许用checkout的新版回滚指令reset
  • 已提交但么有push的提交怎么吊销?—— resetrevert
  • 已push的提交怎么吊销?—— 同上,先本地吊销,然后强制推送git push origin -f⚠️留意慎用! 记住先pull获取更新。

Git入门图文教程⑧-后悔药:怎么撤销变更?

懊悔指令

指令 描述
git checkout . 吊销作业区的(未暂存)修正,把暂存区康复到作业区。不影响暂存区,假如没暂存,则吊销一切作业区修正
git checkout [file] 同上,file指定文件
git checkout HEAD . 吊销作业区、暂存区的修正,用HEAD指向的当时分支最新版别替换作业区、暂存区
git checkout HEAD [file] 同上,file指定文件
git reset 吊销暂存区状况,同git reset HEAD,不影响作业区
git reset HEAD [file] 同上,指定文件fileHEAD可省掉
git reset [commit] 回退到指定版别,清空暂存区,不影响作业区。作业区需要手动git checkout签出
git reset –soft [commit] 移动分支masterHEAD到指定的版别,不影响暂存区、作业区,需手动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 v4git reset --hard HEAD~2masterHEAD会指向v4提交,v5v6就被废弃了。
  • 也可以从头康复到v6版别:git reset --hard v6,便是移动masterHEAD的“指针”地址。

Git入门图文教程⑧-后悔药:怎么撤销变更?

reset有三种形式,对应三种参数:mixed(默许形式)、softhard。三种参数的主要差异便是对作业区、暂存区的操作不同。

  • mixed为默许形式,参数可以省掉。
  • 只有hard形式会重置作业区、暂存区,一般用这个形式会多一点。

Git入门图文教程⑧-后悔药:怎么撤销变更?

形式名称\ 描述 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

安全的吊销某一个提交记载,根本原理便是出产一个新的提交,用原提交的逆向操作来完结吊销操作。留意,这不同于resetreset是回退版别,revert只是用于吊销某一次前史提交,操作是比较安全的。

Git入门图文教程⑧-后悔药:怎么撤销变更?

如上图:

  • 想吊销v4的修正,履行git revert v4,会发生一个新的提交v-4,是v4的逆向操作。
  • 一起更新maserHEAD“指针”位置,以及作业区内容。
  • 假如已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常用指令调集

️版权声明:版权一切@安木夕,本文内容仅供学习,欢迎指正、交流,转载请注明出处!