Git命令学习之git-reset详解
发布时间 - 2023-03-23 00:00:00 点击率:次git-reset的作用是重置当前分支的HEAD指针,将HEAD指针指向特定的状态。
使用概述
git reset [] [--] git reset [--pathspec-from-file= [--pathspec-file-nul]] [ ] git reset (--patch | -p) [ ] [--] [ ] git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [ ]
前三行reset命令的作用是将指定的
就是像树一样的东西,git中是有很多都能组成树的,比如commit树或者tag树。
最后一行reset命令的作用是将当前分支的HEAD指针指向
在以上所有的命令形式中,都是把
git reset [
该方法有如下规则:
会将与
相匹配的路径资源在缓存区中重置成 中的状态。不了解 是什么? 被提交到缓存区中的改动会被还原到工作区中。
举个?
假设项目中有一个coffee.txt文件,文件内容如下:
卡布奇诺纳瑞冰-19.9¥ 标准美式-14.9¥ 香草拿铁-19.9¥ 生椰爱摩卡-19.9¥ ...
我们使用git的tag命令将当前的版本标记成v1.0.0(这里使用tag标签作为)。
随后修改coffee.txt文件,修改内容如下:
卡布奇诺纳瑞冰-19.9¥ --> 卡布奇诺纳瑞冰-14.9¥ 标准美式-14.9¥ --> 标准美式-9.9¥ 香草拿铁-19.9¥ --> 香草拿铁-14.9¥ 生椰爱摩卡-19.9¥ --> 生椰爱摩卡-14.9¥ ...
变更了coffee.txt文件后,再使用git tag打上了v1.0.1标记。
如果此时想将coffee.txt文件还原成v1.0.0版本中的文件,就可以使用git reset命令并指定为v1.0.0,操作如下:
git reset v1.0.0 coffee.txt
使用VSCode查看缓存区的文件变动:
可以看到图中的右侧的代码改动对比,此时缓存区中的coffee.txt文件已经成功被重置成v1.0.0版本中文件的状态(规则1)。并且此时v1.0.1已经提交到缓存区中的变动也被还原到了工作树中(规则2)。
可以看出git reset命令与git add命令作用相反,一个是将指定的资源添加到缓存区,另一个则是从缓存区中移除。并且这个命令与git restore [--source=
上面说过了,在使用reset命令后,此时缓存区中文件内容是v1.0.0的,可以配合git restore命令将缓存区中的内容还原到工作区中然后进行修改:
git restore coffee.txt --staged
也可以根据需要选择还原工作区的内容:
git restore coffee.txt --worktree
git reset [--pathspec-from-file=
在上面的例子中每次进行reset和restore的都是想同的
该文件每一行都是一个
git reset (--patch | -p) [
交互式的选择
git reset [
该命令会把当前分支的HEAD指针指向某个
--soft
工作区和缓存区中的文件变动都将被保留,然后将HEAD指针指向
还是以咖啡菜单为?,假如第一次commit到仓库中的文件内容如下:
卡布奇诺纳瑞冰-19.9¥ 标准美式-14.9¥ 香草拿铁-19.9¥ 生椰爱摩卡-19.9¥ ...
然后做第二次commit操作,删除标准美式,增加生椰拿铁:
卡布奇诺纳瑞冰-19.9¥ -标准美式-14.9¥ +生椰拿铁-19.9¥ 香草拿铁-19.9¥ 生椰爱摩卡-19.9¥ ...
在commit后,修改卡布奇诺纳瑞冰的价格,添加到缓存区。再修改香草拿铁的价格,保留在工作区:
-卡布奇诺纳瑞冰-19.9¥ +卡布奇诺纳瑞冰-14.9¥ // 添加到缓存区中 生椰拿铁-19.9¥ -香草拿铁-19.9¥ +香草拿铁-14.9¥ // 保留在工作区 生椰爱摩卡-19.9¥ ...
此时我想保留工作区和缓存区做的改动,并且将HEAD指针指向第一次commit。这时可以使用--soft选项实现:
git reset HEAD^ --soft // 这里使用HEAD^表示上一个commit,同样也可以使用hash id
使用git log查看当前HEAD指针确实已经指向第一个commit,第二个commit被抛弃了:
同时所有的工作区和缓存区的改动都被保留了:
当前只有两次的commit,是为了方便演示--soft选项的作用。但是在实际开发中,我们可能会commit多次,尤其是在测试环境改几个BUG就要提交到发布平台,这样会导致很多无意义的commit。这时候就可以使用--soft选项,重置HEAD到指定的
--mixed
重置缓存区,但是会保留工作区的内容,这是
相信在理解了--soft作用后,理解--mixed不难,上面例子中如果是使用--mixed那么最终结果如下:
该选项会重置缓存区,但是保留工作区的改动,并将当前指针指向
--hard
重置缓存区和工作区中的所有的变动,并且将指针指向
--hard更加的简单粗暴,我们将--soft例子改为--hard来查看结果:
如图所示,工作区和缓存区的内容都被重置了。不止是如此,就连Untracked文件同样也会被删除。
--merge
该选项的作用,看字面意思就知道大概就是把当前分支和指定的
重置缓存区,任何已经添加到缓存区的改动都将被抛弃
如果
和HEAD之间有文件存在不同(这个不同指的是文件被删除或者新增),那么将会把该文件重置成 中的状态(新增或删除)。 如果
和HEAD之间有文件存在不同(这个不同是指文件内容的不同),且此时工作区也存在未提交的改动,那么本次的reset将会被终止。 如果一个文件在
和HEAD中完全相同,但是它的工作区存与缓存区存在着不同(也就是改动未提交到缓存区),那么该文件在工作区的改动在重置之后就会被保留。
我们举个例子来验证一下以上列出的规则,假设此时的咖啡店项目有如下的几个commit。
第一个commit和文件内容如下:
第一个commit中只有一个coffee.txt菜单文件,此时如果咖啡店引进了新品种开始卖果汁,那么就需要新增果汁菜单文件fruits.txt,于是就有了第二个commit:
此时我们做一些改动来验证1,2,4这几点的规则,改动后的文件如下:
首先修改coffee.txt文件,新增一款生椰拿铁咖啡,保留在工作区中。然后增加咖啡豆菜单文件beans.txt,将其添加到缓存区中。
假设因需求变动,咖啡豆菜单文件在缓存区中需要清除,果汁菜单文件需要删除,只有咖啡菜单中新增的生椰拿铁的改动需要保留。那么就可以使用git reset --merge将HEAD和commit-1进行合并,操作如下:
git reset --merge HEAD^
结果如下:
执行命令reset命令产生了如下效果:
- 将当前HEAD指针指向了commit-1
- 将缓存区中的beans.txt文件抛弃(规则1)
- HEAD(commit-2)和commit-1中的fruits.txt文件存在不同(commit-2中新增fruits.txt),所以会将fruits.txt删除(规则2)
- coffee.txt文件新增生椰拿铁的改动被保留在工作区中(规则4)
再来验证一下第3点规则,假设咖啡店项目此时第一个commit如下:
接下去同样新增水果茶菜单,然后再修改coffee.txt文件,第二个commit如下:
然后在HEAD中再修改coffee.txt文件,删除掉标准美式品种:
此时,如果我们再使用git reset --merge HEAD^就无法再进行重置,该操作会被git终止(规则3)。并且控制台会进行报错提示:
--keep
该选参的作用和--merge相似,唯一的区别就是缓存区中被重置的会被保留在工作区中。
构造如下第一个commit:
改造第二个commit:
在HEAD中进行修改
使用git reset --keep命令:
从结果上来看,只有fruits.txt文件被删除了,beans.txt文件被重置回了工作区中。coffee.txt文件的改动也被保留了。
--[no-]recurse-submodules
使用该选项可以控制是否递归的重置submdoule。如果想要更详细了解,查看这篇文章。
总结
git-reset命令的作用就是重置缓存区和工作区,同时它也提供多个选项来做更具体的控制,使得该命令更加灵活多变。git-reset命令在我们的工作中经常使用,因此熟练掌握该命令是非常重要的。
更多编程相关知识,请访问:编程入门!!
# github
# git
# 递归
# 指针
# vscode
# bug
# 区中
# 第一个
# 都是
# 第二个
# 摩卡
# 可以使用
# 将会
# 几个
# 就会
# 该文件
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
魔毅自助建站系统:模板定制与SEO优化一键生成指南
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何快速搭建高效服务器建站系统?
微信小程序 闭包写法详细介绍
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
详解jQuery中的事件
如何挑选高效建站主机与优质域名?
如何快速生成专业多端适配建站电话?
如何快速搭建高效可靠的建站解决方案?
Firefox Developer Edition开发者版本入口
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel观察者模式如何使用_Laravel Model Observer配置
lovemo网页版地址 lovemo官网手机登录
Python进程池调度策略_任务分发说明【指导】
如何在Windows环境下新建FTP站点并设置权限?
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
中山网站推广排名,中山信息港登录入口?
制作电商网页,电商供应链怎么做?
BootStrap整体框架之基础布局组件
Java遍历集合的三种方式
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Swift中swift中的switch 语句
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
如何在橙子建站中快速调整背景颜色?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
如何批量查询域名的建站时间记录?
如何用5美元大硬盘VPS安全高效搭建个人网站?
如何在局域网内绑定自建网站域名?
网站制作免费,什么网站能看正片电影?
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel如何处理表单验证?(Requests代码示例)
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
Python高阶函数应用_函数作为参数说明【指导】
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
jQuery中的100个技巧汇总
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
如何在云主机上快速搭建多站点网站?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
JavaScript Ajax实现异步通信
EditPlus中的正则表达式实战(6)
原生JS获取元素集合的子元素宽度实例
详解CentOS6.5 安装 MySQL5.1.71的方法
公司门户网站制作流程,华为官网怎么做?
大学网站设计制作软件有哪些,如何将网站制作成自己app?


t,同样也可以使用hash id