Git 系列教程(7)- 撤销操作
撤销操作
- 在任何一个阶段,你都有可能想要撤销某些操作
- 有些撤销操作是不可逆的
--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)- 撤销操作的更多相关文章
- [译]Atlassian Git系列教程
国庆期间把Atlassian的Git系列教程看完了.边看边翻译了相关文章. 原教程: https://www.atlassian.com/git/tutorials/ 我翻译的: git init g ...
- js系列教程1-数组操作全解
全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...
- jquery系列教程2-style样式操作全解
全栈工程师开发手册 (作者:栾鹏) 快捷链接: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件 ...
- jquery系列教程4-事件操作全解
点击打开: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件操作全解 jquery系列教程5-动 ...
- JPA 系列教程2-单表操作
JPA Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibe ...
- git基本命令之删除撤销操作
1.将删除文件恢复--撤销所删除的文件git checkout 文件名 2.git resetgit reset --hard commitID(或某个节点)----强制切换到某个点,会导致所修改的内 ...
- git的回退和撤销操作
回退是git的使用中很常用的一个操作,如果清楚各个回退命令的作用,不仅大大加快代码回退的效率,还能避免代码回退造成的事故 1.git reset --hard [commit] 清空暂存和未暂存的更改 ...
- Git系列教程三 配置与基本命令
一.安装Git 网上有很多安装教程,可以参考.这里使用的是Windows版本的Git,点击这里下载. 二.基本设置 安装完成后,通过点击鼠标右键就可以看到新添加了俩个Git命令:Git GUI Her ...
- git 入门教程之撤销更改
撤销更改 相信你已经了解了 git 的基本概念,也清楚了工作区,暂存区和版本库的关系,现在让我们用所学的知识继解决实际问题吧! 背景 正常看得见的目录是我们最为熟悉的工作区,在工作中不可能总是100% ...
随机推荐
- Python中面向对象的概念
1.语言的分类 1)面向机器 抽象成机器指令,机器容易理解.代表:汇编语言. 2)面向过程 做一件事,排除步骤,第一步做什么,第二步做什么,如果出现A问题,做什么处理,出现b问题,做什么处理.问题规模 ...
- 11、pass,is,位运算的补充
pass的补充 一般Python的代码是基于:和缩进来实现,Python中规定代码块中必须要有代码才算完整,在没有代码的情况下为了保证语法的完整性可以用pass代替 if 条件: pass else: ...
- 想了解FlinkX-Oracle Logminer?那就不要错过这篇文章
FlinkX-Oracle Logminer模块是FlinkX基于Logminer对Oracle重做日志进行实时采集分析,可对Oracle进行实时同步也可以通过指定SCN或者时间戳从某个节点进行同步, ...
- Android Studio 分类整理 res/layout 中的布局文件
•准备工作 新建一个名为 TestLayouts 的项目: 进入 Project 模式: 来到 TestLayouts/app/src/main/res/layout 文件夹下: •分类整理 layo ...
- python自动统计zabbix系统监控覆盖率
脚本主要功能: 1)通过zabbix api接口采集所有监控主机ip地址: 2)通过cmdb系统(蓝鲸)接口采集所有生产主机IP地址.主机名.操作系统.电源状态: 3)以上2步返回数据对比,找出未监控 ...
- limanmanExp数据库审计设计思路与重要代码
目的 在代码审计的时候经常会想看看某个访问会触发哪些数据库操作.目前已知的数据库审计有多家大型厂商的设备,还有seay源码审计系统中的数据库监控1.0 但是.开源的已知的就只有seay源码审计系统中的 ...
- Ansible-Playbook中的变量使用
变量名:仅能由字母.数字和下划线组成,且只能以字母开头 变量来源: 1.ansible all -m setup 远程主机的所有变量都可直接调用 #显示所有变量 ansible all -m setu ...
- 使用 EPPlus 封装的 excel 表格导入功能 (.net core c#)
使用 EPPlus 封装的 excel 表格导入功能 前言 最近做系统的时候有很多 excel导入 的功能,以前我前后端都做的时候是在前端解析,然后再做个批量插入的接口 我觉着这样挺好的,后端部分可以 ...
- Scrapy框架的安装
Win+R 输入cmd打开命令行 我们先把pip升级到最新版,输入代码如下: pip install --upgrade pip 不过一般这种更新方式会经常性出错,安装文件在下载到一半时就会超时报错 ...
- [.net] 关于Exception的几点思考和在项目中的使用(三)
本文链接: https://www.cnblogs.com/hubaijia/p/about-exceptions-3.html 系列文章: 关于Exception的几点思考和在项目中的使用(一) 关 ...