撤销操作

  • 在任何一个阶段,你都有可能想要撤销某些操作
  • 有些撤销操作是不可逆的

--amend 修补提交

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,就可以运行带有 --amend 选项的提交命令来重新提交

git commit --amend

会再次提交暂存区的内容,但会覆盖最后一次提交的信息

git commit -m 'initial commit'
git add forgotten_file
git commit --amend -m "second commit" 
  • 最终只会有一个提交历史,第二次提交将代替第一次提交的结果
  • 如果查看提交历史 git log,只会发现第二次提交的 second commit,而不会出现第一次提交的 initial commit
  • 优势:可以稍微改进最新的提交信息,而不会打乱代码仓库的提交历史,每修改一小块就提交一次,提交历史就会特别臃肿

取消暂存的文件

目前我用最新版的 git(2.31.1) ,它会提示用 git restore 来取消暂存,但是官方文档会用 git reset

  • git restore
  • git reset

restore

polo@B-J5D1MD6R-2312 watermarker % git add .
polo@B-J5D1MD6R-2312 watermarker % git status
位于分支 master
您的分支领先 'origin/master' 共 5 个提交。
(使用 "git push" 来发布您的本地提交) 要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
删除: test1.txt
删除: ttrtt.txt

执行 git restore

polo@B-J5D1MD6R-2312 watermarker % git restore --staged test1.txt
polo@B-J5D1MD6R-2312 watermarker % ls
README.md font markers.py test.py venv
polo@B-J5D1MD6R-2312 watermarker % git status
位于分支 master
您的分支领先 'origin/master' 共 5 个提交。
(使用 "git push" 来发布您的本地提交) 要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
删除: ttrtt.txt 尚未暂存以备提交的变更:
(使用 "git add/rm <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
删除: test1.txt

这里未追踪的文件还能继续使用 git restore,会直接丢弃之前的改动,比如这里是删除文件,执行后它会恢复文件

polo@B-J5D1MD6R-2312 watermarker % git restore test1.txt
polo@B-J5D1MD6R-2312 watermarker % git status
位于分支 master
您的分支领先 'origin/master' 共 5 个提交。
(使用 "git push" 来发布您的本地提交) 要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
删除: ttrtt.txt polo@B-J5D1MD6R-2312 watermarker % ls
README.md font markers.py test.py test1.txt venv

可以看到上面的 ls 和下面的 ls 对比,很明显 test1.txt 回来了

reset

git reset HEAD <文件名>

具体栗子

olo@B-J5D1MD6R-2312 watermarker % git add .
polo@B-J5D1MD6R-2312 watermarker % git status
位于分支 master
您的分支领先 'origin/master' 共 5 个提交。
(使用 "git push" 来发布您的本地提交) 要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
删除: test1.txt
删除: ttrtt.txt polo@B-J5D1MD6R-2312 watermarker % git reset HEAD test1.txt
重置后取消暂存的变更:
D test1.txt
polo@B-J5D1MD6R-2312 watermarker % git status
位于分支 master
您的分支领先 'origin/master' 共 5 个提交。
(使用 "git push" 来发布您的本地提交) 要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
删除: ttrtt.txt 尚未暂存以备提交的变更:
(使用 "git add/rm <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
删除: test1.txt

能看到 test1.txt 已经撤销暂存区了

reset 同时撤销所有暂存区的提交

git reset 

高危操作,不加任何参数,直接把所有提交都撤销

具体栗子

polo@B-J5D1MD6R-2312 watermarker % git add .
polo@B-J5D1MD6R-2312 watermarker % git status
位于分支 master
您的分支领先 'origin/master' 共 5 个提交。
(使用 "git push" 来发布您的本地提交) 要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
重命名: test1.txt -> test22.txt
重命名: ttrtt.txt -> test3.txt
新文件: testt.txt polo@B-J5D1MD6R-2312 watermarker % git reset
重置后取消暂存的变更:
D test1.txt
D ttrtt.txt
polo@B-J5D1MD6R-2312 watermarker % git status
位于分支 master
您的分支领先 'origin/master' 共 5 个提交。
(使用 "git push" 来发布您的本地提交) 尚未暂存以备提交的变更:
(使用 "git add/rm <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
删除: test1.txt
删除: ttrtt.txt 未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
test22.txt
test3.txt
testt.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
polo@B-J5D1MD6R-2312 watermarker % ls
README.md markers.py test22.txt testt.txt
font test.py test3.txt venv
polo@B-J5D1MD6R-2312 watermarker %

本来有三个提交,执行完 git reset 直接都撤销出暂存区,需要重新提交了

撤销对文件的修改

不想保留对某个文件的修改怎么操作?就是将它还原成上次提交时的样子(或者刚 clone 下来的样子)

git 也有对应的提示(新版暂时没发现有这提示)

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md

重点记住这个 checkout 命令

git checkout -- <file>...

具体栗子

polo@B-J5D1MD6R-2312 watermarker % git add .
polo@B-J5D1MD6R-2312 watermarker % echo 12344 >> test3.txt
polo@B-J5D1MD6R-2312 watermarker % git status
位于分支 master
您的分支领先 'origin/master' 共 5 个提交。
(使用 "git push" 来发布您的本地提交) 要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
重命名: test1.txt -> test22.txt
新文件: test3.txt
重命名: ttrtt.txt -> testt.txt 尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: test3.txt polo@B-J5D1MD6R-2312 watermarker % git checkout -- test3.txt
polo@B-J5D1MD6R-2312 watermarker % git status
位于分支 master
您的分支领先 'origin/master' 共 5 个提交。
(使用 "git push" 来发布您的本地提交) 要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
重命名: test1.txt -> test22.txt
新文件: test3.txt
重命名: ttrtt.txt -> testt.txt

可以看到 test3.txt 的修改已经被撤销了

重点

  • 它也是一个高危命令
  • 执行 git checkout 命令后,对那个文件在本地的任何修改都会消失,而 Git 会用最近提交的版本来覆盖掉它

Git 系列教程(7)- 撤销操作的更多相关文章

  1. [译]Atlassian Git系列教程

    国庆期间把Atlassian的Git系列教程看完了.边看边翻译了相关文章. 原教程: https://www.atlassian.com/git/tutorials/ 我翻译的: git init g ...

  2. js系列教程1-数组操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  3. jquery系列教程2-style样式操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件 ...

  4. jquery系列教程4-事件操作全解

    点击打开: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件操作全解 jquery系列教程5-动 ...

  5. JPA 系列教程2-单表操作

    JPA Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibe ...

  6. git基本命令之删除撤销操作

    1.将删除文件恢复--撤销所删除的文件git checkout 文件名 2.git resetgit reset --hard commitID(或某个节点)----强制切换到某个点,会导致所修改的内 ...

  7. git的回退和撤销操作

    回退是git的使用中很常用的一个操作,如果清楚各个回退命令的作用,不仅大大加快代码回退的效率,还能避免代码回退造成的事故 1.git reset --hard [commit] 清空暂存和未暂存的更改 ...

  8. Git系列教程三 配置与基本命令

    一.安装Git 网上有很多安装教程,可以参考.这里使用的是Windows版本的Git,点击这里下载. 二.基本设置 安装完成后,通过点击鼠标右键就可以看到新添加了俩个Git命令:Git GUI Her ...

  9. git 入门教程之撤销更改

    撤销更改 相信你已经了解了 git 的基本概念,也清楚了工作区,暂存区和版本库的关系,现在让我们用所学的知识继解决实际问题吧! 背景 正常看得见的目录是我们最为熟悉的工作区,在工作中不可能总是100% ...

随机推荐

  1. python列表,元组,字典,集合的比较总结

    这四个都是python中的序列,用于存放数据,他们区别总结如下:   列表list 元组tuple 字典dictionary 集合set 是否可变 可变 不可变 可变 可变 是否有序 有序 有序 无序 ...

  2. 操作系统实验(一)-Shell编程

    操作系统实验:Shell编程 emmmmm,实验前老师发了一份实验说明,里面有教怎么配置虚拟机Ubuntu.这里就不做过多叙述,需要说明的是,kali和ubuntu都可以以shell运行这个C语言程序 ...

  3. 体验用yarp当网关

    Yarp是微软开源的一个用.net实现的反向代理工具包,github库就叫reverse-proxy(反向代理)(吐槽一下微软起名字233333) nuget包preview9之前都叫Microsof ...

  4. IT培训有哪些坑(三)?

    我们继续来说说IT培训的坑,今天讲的这点,非常重要,几乎适合于所有层面的培训,不仅仅是IT行业.近期有参加各种培训打算的,包括各种营销培训,管理培训等等,都是有用的. 有大企业,名人背景的不靠谱.不要 ...

  5. AppDomain实现【插件式】开发

    前言: 近期项目中需要实现"热插拔"式的插件程序,例如:定义一个插件接口:由不同开发人员实现具体的插件功能类库:并最终在应用中调用具体插件功能. 此时需要考虑:插件执行的安全性(隔 ...

  6. 从 lite-apiserver 看 SuperEdge 边缘节点自治

    引言 在 SuperEdge 0.2.0版本中,lite-apiserver 进行了重大的架构升级和功能增强.本文将从 lite-apiserver 实现及其与其它 SuperEdge 组件协同的角度 ...

  7. [GDKOI2021] 普及组 Day1 总结

    [ G D K O I 2021 ] 普 及 组 D a y 1 总 结 [GDKOI2021] 普及组 Day1 总结 [GDKOI2021]普及组Day1总结 长达3天的快乐GDKOI2021普及 ...

  8. UML相关汇总

    类图 类图是UML最常用的图之一,用于描述面向对象程序设计中,类.接口等结构之间的关系,如图 类图中涉及到以下几种类型的对象 UMLClass 如图中Class1,代表类 UMLOperation 如 ...

  9. C语言-字符串函数的实现(一)之strlen

    C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...

  10. RocketMq(一)初识

    消息中间件基本上是互联网公司必用的一个中间件,为什么要使用MQ,当然是因为能给我们的系统带来很多好处. 消息队列简单来说是一种先进先出的数据结构,先简单认识下. 一.应用场景 消息中间件主要应用场景主 ...