Git回滚操作,工作区和暂存区恢复修改删除的文件

在利用git协作过程中,经常需要进行代码的撤销操作,这个行为可能发生在工作区,暂存区或者仓库区(或版本库)。

我们先讨论在工作区与暂存区发生的撤销行为,这里会有两个命令提供帮助,git restore与git checkout。

后面我们会讨论在仓库区发生的撤销行为,这里同样会有两个命令提供帮助,git reset与git revert。

工作区和暂存区回滚

git restore

git restore主要是在工作区与暂存区之间进行撤销操作。

撤销工作区文件更改

我们在工作区修改了某个文件,然后我们想放弃此次修改,那么可以使用git restore 文件路径。修改文件后,我们查看文件状态,可以看到文件状态已经变化。

git status -s输出:M README.md// 回滚所有变动的文件
git restore *// 回滚某个文件
git restore README.md

如果我们同时修改了多个文件,想全部撤销,则可以执行git restore .命令

结论:git restore pathspec 指令使得在工作空间但是不在暂存区的文件撤销更改(内容恢复到没修改之前的状态)。

撤销暂存区文件更改

git restore --staged pathspec指令将暂存区的文件撤回到工作区,但不会更改文件的内容。我们将某个文件进行修改并添加到暂存区,查看状态。

git status 输出:
...
Changes to be committed:...modified:   README.md进行撤销后,再进行状态的查看:
git restore --staged README.md  git status输出:
...
Changes not staged for commit:...modified:   README.md
...

如果我们想撤销暂存区的所有文件改动到工作区,则可以执行git restore --staged .命令

从上面我们能看出git restore命令的局限性:

它无法直接对暂存区的文件撤销到原始未修改状态。
也没有能力直接将工作区与暂存区文件同时撤销到原始未修改状态。
接下来我们可以看看git checkout的表现。

git checkout

git checkout [<commit>] [--] <filePath>语法:

checkout 命令主要是覆盖工作区(如果<commit>不省略,也会替换暂存区中相应的文件),且不会改变 HEAD 指针。
<commit> 是可选项,如果省略则默认是从暂存区检出。这和下面将要讲述的 git reset重置大不相同,重置的默认值是HEAD,即等于git reset HEAD。
为了避免路径<filePath>和引用(或者提交)<commit> 同名而冲突,可以在<filePath>前用两个连续的短线减号作为分隔。如git checkout HEAD -- <filePath>

常用语法示例:

当执行 git checkout . 或者 git checkout <filePath> 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中改动。
当执行 git checkout HEAD . 或者 git checkout HEAD <filePath> 命令时,会用 HEAD 提交的全部或者部分文件替换暂存区以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中的改动,也会清除暂存区中的改动。

仓库区回滚

git revert 

git revert -n commit-id:只会反做commit-id对应的内容,然后重新commit一个信息,不会影响其他的commit内容。

比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:

git revert -n commit-idA..commit-idB:反做commit-idA到commit-idB之间的所有commit

注意:使用-n是应为revert后,需要重新提交一个commit信息,然后在推送。如果不使用-n,指令后会弹出编辑器用于编辑提交信息

适用场景:如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

冲突解决

在git revert操作过程中,冲突难以避免,下面有几种解决方式

git revert --abort:冲突发生后,当前的操作会回到指令执行之前的样子,回到原始的状态,相当于什么事没有发生
git revert --quit:冲突发生后,从反做操作行为中退出,该指令会保留文件冲突
git revert --skip:冲突发生后,跳过此次反做操作
git revert --continue:冲突发生后,解决冲突并add后,执行该命令,会继续之前的操作流程

冲突发生后,也可以手动操作:

  git add .git commit -m "提交的信息"git push
具体操作

先查看历史提交记录

git log --oneline输出:
0681044 (HEAD -> dev, origin/dev) v3
3a854db v2
fc00739 v1
8785cc6 dev提交
709627d Initial commit

对提交信息为v1的进行反做

git revert -n fc00739输出:
Auto-merging README.en.md
CONFLICT (content): Merge conflict in README.en.md
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
error: could not revert fc00739... v1
...

出现冲突,进行修改,重新添加文件到暂存区,并进行提交

git add .git revert --continue输出:
hint: Waiting for your editor to close the file... unix2dos: converting file D:/project/personal/gittestproject/.git/COMMIT_EDITMSG to DOS format...
dos2unix: converting file D:/project/personal/gittestproject/.git/COMMIT_EDITMSG to Unix format...
[dev 972bfce] Revert "v2"2 files changed, 2 insertions(+), 2 deletions(-)

 推送到远程

git push

查看提交历史记录

git log --oneline 输出:
77adce6 (HEAD -> dev, origin/dev) Revert "v1"
0681044 v3
3a854db v2
fc00739 v1
8785cc6 dev提交
709627d Initial commit

git reset

先通过举个例子,来一个感性的认识。下面这两条命令让 hotfix 分支向后回退两个提交。

git checkout hotfix
git reset HEAD~2

 

 

仓库区HEAD指针指向当前分支最新提交,回退两个提交后,hotfix 分支末端的两个提交现在变成了孤儿提交,如果你的提交还没有提交到远程,可以如上所示,直接用git reset撤销这些提交。

若之前提交已经提交到远程,使用git reset进行回退后,再使用git push提交更改,此时会报错,因为我们本地库HEAD指向的版本比远程库的要旧。所以我们要用git push -f强制推上去,就可以了,那么回退就成功了!

适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。

reset 的作用
为了演示下面这些例子,假设我们修改了 file.txt 文件并第三次提交它。 现在的历史看起来是这样的:

现在,假设我们运行git reset HEAD~(后面可能会跟不同的参数)。

第 1 步:移动 HEAD(–soft)
reset 做的第一件事是移动所在分支 HEAD 的指向。

运行 git reset HEAD~ –-soft 将会指向 9e5e6a4,这与checkout通过切换分支来改变 HEAD 自身不同。

结合上图,我们理解一下发生的事情:它本质上是撤销了上一次 git commit 命令。 当你在运行 git commit 时,Git 会创建一个新的提交,并移动当前所在分支 HEAD 的指向,使之指向最新提交。 当你将它 reset --soft 回 HEAD~(HEAD 的父结点)时,其实就是把该分支移回原来的位置,而不会改变暂存区和工作区。

具体表现是:撤销上一次git commit的文件,将其放在暂存区,并与暂存区文件进行合并(如果有相同文件改动的话),工作区没有改变

第 2 步:更新暂存区(–mixed)
接下来,git reset HEAD~ –-mixed 会用 HEAD 指向的当前快照的内容来更新暂存区。

 这也是默认行为,即可以忽略选项,git reset HEAD~。

现在再看一眼上图,理解一下发生的事情:它依然会撤销一上次提交,但还会取消所有暂存。 于是,我们回滚到了所有 git add 和 git commit 的命令执行之前。

具体表现是:撤销上一次git commit的文件,并取消所有暂存区文件,将其与工作区文件进行合并(如果有相同文件改动的话)

第 3 步:更新工作区(–hard)
如果使用 –-hard 选项,git reset HEAD~ --hard 要做的的第三件事情就是让工作区看起来像暂存区。

现在让我们回想一下刚才发生的事情:你撤销了最后的提交(git commit )、git add 和工作区中的所有工作。

必须注意,–hard 标记是 reset 命令唯一的危险用法,它也是 Git 会真正地销毁数据的仅有的几个操作之一。其他任何形式的 reset 调用都可以轻松撤消,但是 –hard 选项不能,因为它强制覆盖了工作区中的文件。

具体表现是:撤销暂存区与工作区所有文件改动

顺序总结
reset 命令会以特定的顺序重写这三棵树,在你指定以下选项时停止:

移动 HEAD 指向的分支 (若指定了 --soft,则到此停止)
重置 index 以便和 HEAD 相匹配 (若未指定,或指定 --mixed,则到此停止)
使工作区看起来像暂存区 (若指定 --hard)
reset与revert的区别
git reset 是回滚到对应的commit-id,相当于是删除了commit-id以后的所有的提交,并且不会产生新的commit-id记录,如果要推送到远程服务器的话,需要强制推送-f
git revert 是反做撤销其中的commit-id,然后重新生成一个commit-id。本身不会对其他的提交commit-id产生影响,如果要推送到远程服务器的话,就是普通的操作git push就好了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day 15 Linux网络管理

IP解析 IP地址组成&#xff1a;IP地址由4部分数字组成&#xff0c;每部分数字对应于8位二进制数字&#xff0c;各部分之间用小数点分开&#xff0c;这是点分2进制。如果换算为10进制我们称为点分10进制。 每个ip地址由两部分组成网络地址(NetID)和主机地址(HostID).网络地址表…

养猫必看!毛发护理秘籍,猫粮选择大揭秘!

亲爱的猫友们&#xff0c;我们都知道&#xff0c;猫咪的毛发是它们健康与美丽的象征。选择一款合适的猫粮&#xff0c;对于猫咪的毛发健康至关重要。那么&#xff0c;如何根据猫咪的毛发情况来选择合适的猫粮呢&#xff1f;接下来&#xff0c;就让我来为你详细解答吧&#xff0…

PDF文档电子签名怎么做?

如何确保电子文档的签署具有公信力和法律效力&#xff0c;防止伪造和假冒签名等问题&#xff0c;是电子文档无纸化应用面临的重要挑战。本文将详细介绍PDF文档电子签名的概念、重要性、实施步骤以及相关的法律背景&#xff0c;帮助用户理解并有效应用PDF文档电子签名技术。 1.…

lv_micropython for ESP32-S2/S3/C3

一、更新文件 lv_binding_micropython:GitHub - kdschlosser/lv_binding_micropython at esp32-s-c-h_support 下载lv_binding_micropython分支&#xff1a; git clone -b esp32-s-c-h_support https://github.com/kdschlosser/lv_binding_micropython.git 替换文件&#x…

安装指定版本的ant-design-vue和指定版本的@ant-design/icons-vue 图标组件包

前言&#xff1a; 最近在完成公司的项目时&#xff0c;为了兼容其他的版本&#xff0c;需要安装指定版本的ant-design-vue和ant-design/icons-vue 图标组件包&#xff0c;安装成功之后&#xff0c;分享如下&#xff1a; 安装命令&#xff1a; ant-design-vue&#xff1a; 不…

【MATLAB源码-第54期】基于白鲸优化算法(WOA)和遗传算法(GA)的栅格地图路径规划最短路径和适应度曲线对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1.白鲸优化算法&#xff08;WOA&#xff09;&#xff1a; 白鲸优化算法是一种受白鲸捕食行为启发的优化算法。该算法模拟了白鲸群体捕食的策略和行为&#xff0c;用以寻找问题的最优解。其基本思想主要包括以下几点&#xff…

Docker 学习笔记(九):Docker 网络原理,理解 docker0,虚拟网卡,容器互联,以及跨网络连通

一、前言 记录时间 [2024-4-16] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;六&#xff09;&#xff1a;挑战容器数据卷技术一文通&#xff0c;实战多个 MySQL 数据同步&#xff0c;能懂会用&#xff0c;初学必备 Docker 学习笔记&#xff08;七&#xff09;&#x…

回归损失函数

目录 1 MAE 2 MSE 3 MAPE 4 Quantile Loss分位数损失 回归损失函数也可以做为评价指标使用&#xff0c;但是有没有想过数据分布与损失函数之间的关系呢&#xff01; 使用特定损失函数的前提是我们对标签的分布进行了某种假设&#xff0c;在这种假设的前提下通过极大似然法推…

基于微信小程序投票评选系统的设计与实现(论文+源码)_kaic

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。所以各大互联网厂商都瞄准移动互联网这个潮…

攻防世界10-disabled_button

10-disabled_button 法1&#xff1a;修改html的标签内容 首先看题目描述提到前端知识&#xff0c;联想到HTML&#xff0c;提示是一个不能按的按钮&#xff0c;结合题目名button很明显是涉及到HTML button标签知识&#xff0c;最后通过disabled提示应该是按钮被禁用了 知识补充…

1990–2016年中国30米分辨率水稻种植分布数据集

本数据集为1990–2016年中国30米分辨率水稻种植分布数据集&#xff0c;覆盖范围包含中国大陆25个省级行政区。数据文件格式为GeoTIFF&#xff0c;地理参考为WGS84&#xff08;EPSG:4326&#xff09;&#xff0c;每年一个文件&#xff0c;文件名格式为 CCD-Rice-China-年份-v1.t…

嵌入式第四天:(C语言入门)

目录 什么是数组&#xff1f; 数组&#xff1a; 数组的使用&#xff1a; 数组的初始化&#xff1a; 数组名&#xff1a; 数组案例&#xff1a; 一维数组的最大值&#xff1a; 一维数组的逆置&#xff1a; 数组和指针&#xff1a; 通过指针操作数组元素&#xff1a; …

二刷大数据(二)- Spark

目录 SparkHadoop区别核心组件运行架构Master&WorkerApplication (Driver)Executor RDD概念yarn下工作原理算子依赖血缘关系阶段划分广播变量 shuffle流程SparkSQLDataSet、DataFrame、RDD相互转换 SparkStreaming Spark Spark是一种基于内存的快速、通用、可扩展的大数据…

为什么养猫圈更信赖进口生骨肉冻干?五款大卖榜单品控稳冻干首次分享

新手养猫人常常会有这样的疑问&#xff1a;为何进口生骨肉冻干价格如此昂贵&#xff0c;但仍有大量养猫达人对其推崇备至&#xff1f;与国产生骨肉冻干相比&#xff0c;进口产品的价格高出3-4倍之多&#xff0c;那么这高昂的价格背后&#xff0c;进口生骨肉冻干是否真的值得推荐…

初识--Linux的虚拟地址空间

重新了解地址空间 在学习c/c语言的时候,大家一定见过以下这张图 说的是程序会加载在如图的结构上,实际上,我们真的对他很了解吗,而在Linux进程控制这,就会有一个奇怪的现象 前提提要:简要介绍一下fork函数 进程内核数据结构(PCB)自己的代码以及数据 在Linux中,fork可以从当…

P9241 [蓝桥杯 2023 省 B] 飞机降落

原题链接&#xff1a;[蓝桥杯 2023 省 B] 飞机降落 - 洛谷 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 dfs全排列的变形题。 因为最后问飞机是否降落&#xff0c;并且一架飞机降落完毕时另一架飞机才能降落。所以我们设置dfs的两个变量cnt为安全…

计算机科学与导论 第十六章 安全

文章预览&#xff1a; 16.1引言16.1.1 安全目标16.1.2 攻击 16.2机密性16.2.1 对称密钥密码术16.2.2 非对称密钥密码术 16.1引言 为了安全&#xff0c;信息需要避开未授权的使用(机密性),保护信息不受到未授权的篡改(完整性)&#xff0c;并且对于得到授权的实体来说是需要时可…

常用序号、标点符号 相关正则表达式

(?:[\(|&#xff08;|\[])?\d[\]|\)&#xff09;|\、]|[\u2460-\u2473]|[\u4e00-\u5341][.|、]匹配序号 \d\.(?!\d)|\d、常规序号匹配&#xff1a; rule1: 标准格式1. 2、 rule2:排除小数 [^\u4E00-\u9FA5\uFF00-\uFFEFa-zA-Z0-9\s]所有符号 [\u3000-\u303F\uFF00-\uFFE…

分类算法——模型选择与调优(三)

交叉验证 交叉验证&#xff1a;将拿到的训练数据&#xff0c;分为训练和验证集。以下图为例&#xff1a;将数据分成4份&#xff0c;其中 一份作为验证集。然后经过4次&#xff08;组&#xff09;的测试&#xff0c;每次都更换不同的验证集。即得到4组模型的 结果&#xff0c;取…

使用Google reCAPTCHA防止机器注册

本文作者&#xff1a;陈进坚 博客地址&#xff1a;https://jian1098.github.io CSDN博客&#xff1a;https://blog.csdn.net/c_jian 简书&#xff1a;https://www.jianshu.com/u/8ba9ac5706b6 联系方式&#xff1a;jian1098qq.com 环境要求 能翻墙的电脑域名 验证原理 在谷歌…