git reset 怎么还原_如何在Git中重置、恢复,返回到以前的状态

编辑推荐:

本文来自51cto,在本文中,我们将带你了解如何去重置、恢复和完全回到以前的状态,做到这些只需要几个简单而优雅的

Git 命令。

用简洁而优雅的 Git 命令撤销仓库中的改变。

使用 Git 工作时其中一个鲜为人知(和没有意识到)的方面就是,如何轻松地返回到你以前的位置 ——

也就是说,在仓库中如何很容易地去撤销那怕是重大的变更。在本文中,我们将带你了解如何去重置、恢复和完全回到以前的状态,做到这些只需要几个简单而优雅的

Git 命令。

重置

我们从 Git 的 reset 命令开始。确实,你应该能够认为它就是一个 “回滚” —— 它将你本地环境返回到之前的提交。这里的

“本地环境” 一词,我们指的是你的本地仓库、暂存区以及工作目录。

先看一下图 1。在这里我们有一个在 Git 中表示一系列提交的示意图。在 Git 中一个分支简单来说就是一个命名的、指向一个特定的提交的可移动指针。在这里,我们的

master 分支是指向链中最新提交的一个指针。

图 1:有仓库、暂存区、和工作目录的本地环境

如果看一下我们的 master 分支是什么,可以看一下到目前为止我们产生的提交链。

$

git log --oneline

b764644 File with three lines

7c709f0 File with two lines

9ef9173 File with one line

如果我们想回滚到前一个提交会发生什么呢?很简单 —— 我们只需要移动分支指针即可。Git 提供了为我们做这个动作的

reset 命令。例如,如果我们重置 master 为当前提交回退两个提交的位置,我们可以使用如下之一的方法:

$

git reset 9ef9173

(使用一个绝对的提交 SHA1 值 9ef9173)

或:

$

git reset current~2

(在 “current” 标签之前,使用一个相对值 -2)

图 2 展示了操作的结果。在这之后,如果我们在当前分支(master)上运行一个 git log

命令,我们将看到只有一个提交。

$

git log --oneline

9ef9173 File with one line

图 2:在 reset 之后

git reset 命令也包含使用一些选项,可以让你最终满意的提交内容去更新本地环境的其它部分。这些选项包括:hard

在仓库中去重置指向的提交,用提交的内容去填充工作目录,并重置暂存区;soft 仅重置仓库中的指针;而

mixed(默认值)将重置指针和暂存区。

这些选项在特定情况下非常有用,比如,git reset --hard

| reference> 这个命令将覆盖本地任何未提交的更改。实际上,它重置了(清除掉)暂存区,并用你重置的提交内容去覆盖了工作区中的内容。在你使用

hard 选项之前,一定要确保这是你真正地想要做的操作,因为这个命令会覆盖掉任何未提交的更改。

恢复

git revert 命令的实际结果类似于 reset,但它的方法不同。reset 命令(默认)是在链中向后移动分支的指针去“撤销”更改,revert

命令是在链中添加一个新的提交去“取消”更改。再次查看图 1 可以非常轻松地看到这种影响。如果我们在链中的每个提交中向文件添加一行,一种方法是使用

reset 使那个提交返回到仅有两行的那个版本,如:git reset HEAD~1。

另一个方法是添加一个新的提交去删除第三行,以使最终结束变成两行的版本 —— 实际效果也是取消了那个更改。使用一个

git revert 命令可以实现上述目的,比如:

$

git revert HEAD

因为它添加了一个新的提交,Git 将提示如下的提交信息:

Revert

"File with three lines"

This reverts commit b764644bad524b804577684bf74e7bca3117f554.

# Please enter the commit message for your changes.

Lines starting

# with '#' will be ignored, and an empty message

aborts the commit.

# On branch master

# Changes to be committed:

# modified: file1.txt

#

图 3(在下面)展示了 revert 操作完成后的结果。

如果我们现在运行一个 git log 命令,我们将看到前面的提交之前的一个新提交。

$

git log --oneline

11b7712 Revert "File with three lines"

b764644 File with three lines

7c709f0 File with two lines

9ef9173 File with one line

这里是工作目录中这个文件当前的内容:

$

cat

Line 1

Line 2

图 3 revert 操作之后

恢复或重置如何选择?

为什么要优先选择 revert 而不是 reset 操作?如果你已经将你的提交链推送到远程仓库(其它人可以已经拉取了你的代码并开始工作),一个

revert 操作是让他们去获得更改的非常友好的方式。这是因为 Git 工作流可以非常好地在分支的末端添加提交,但是当有人

reset 分支指针之后,一组提交将再也看不见了,这可能会是一个挑战。

当我们以这种方式使用 Git 工作时,我们的基本规则之一是:在你的本地仓库中使用这种方式去更改还没有推送的代码是可以的。如果提交已经推送到了远程仓库,并且可能其它人已经使用它来工作了,那么应该避免这些重写提交历史的更改。

总之,如果你想回滚、撤销或者重写其它人已经在使用的一个提交链的历史,当你的同事试图将他们的更改合并到他们拉取的原始链上时,他们可能需要做更多的工作。如果你必须对已经推送并被其他人正在使用的代码做更改,在你做更改之前必须要与他们沟通,让他们先合并他们的更改。然后在这个侵入操作没有需要合并的内容之后,他们再拉取最新的副本。

你可能注意到了,在我们做了 reset 操作之后,原始的提交链仍然在那个位置。我们移动了指针,然后

reset 代码回到前一个提交,但它并没有删除任何提交。换句话说就是,只要我们知道我们所指向的原始提交,我们能够通过简单的返回到分支的原始链的头部来“恢复”指针到前面的位置:

git

reset

当提交被替换之后,我们在 Git 中做的大量其它操作也会发生类似的事情。新提交被创建,有关的指针被移动到一个新的链,但是老的提交链仍然存在。

变基

现在我们来看一个分支变基。假设我们有两个分支:master 和 feature,提交链如下图 4 所示。master

的提交链是 C4->C2->C1->C0 和 feature 的提交链是 C5->C3->C2->C1->C0。

图 4:master 和 feature 分支的提交链

如果我们在分支中看它的提交记录,它们看起来应该像下面的这样。(为了易于理解,C 表示提交信息)

$

git log --oneline master

6a92e7a C4

259bf36 C2

f33ae68 C1

5043e79 C0

$ git log --oneline feature

79768b8 C5

000f9ae C3

259bf36 C2

f33ae68 C1

5043e79 C0

我告诉人们在 Git 中,可以将 rebase 认为是 “将历史合并”。从本质上来说,Git 将一个分支中的每个不同提交尝试“重放”到另一个分支中。

因此,我们使用基本的 Git 命令,可以变基一个 feature 分支进入到 master 中,并将它拼入到

C4 中(比如,将它插入到 feature 的链中)。操作命令如下:

$

git checkout feature

$ git rebase master

First, rewinding head to replay your work on

top of it...

Applying: C3

Applying: C5

完成以后,我们的提交链将变成如下图 5 的样子。

图 5:rebase 命令完成后的提交链

接着,我们看一下提交历史,它应该变成如下的样子。

$

git log --oneline master

6a92e7a C4

259bf36 C2

f33ae68 C1

5043e79 C0

$ git log --oneline feature

c4533a5 C5

64f2047 C3

6a92e7a C4

259bf36 C2

f33ae68 C1

5043e79 C0

注意那个 C3' 和 C5'— 在 master 分支上已处于提交链的“顶部”,由于产生了更改而创建了新提交。但是也要注意的是,rebase

后“原始的” C3 和 C5 仍然在那里 — 只是再没有一个分支指向它们而已。

如果我们做了这个变基,然后确定这不是我们想要的结果,希望去撤销它,我们可以做下面示例所做的操作:

$

git reset 79768b8

由于这个简单的变更,现在我们的分支将重新指向到做 rebase 操作之前一模一样的位置 —— 完全等效于撤销操作(图

6)。

图 6:撤销 rebase 操作之后

如果你想不起来之前一个操作指向的一个分支上提交了什么内容怎么办?幸运的是,Git 命令依然可以帮助你。用这种方式可以修改大多数操作的指针,Git

会记住你的原始提交。事实上,它是在 .git 仓库目录下,将它保存为一个特定的名为 ORIG_HEAD

的文件中。在它被修改之前,那个路径是一个包含了大多数最新引用的文件。如果我们 cat 这个文件,我们可以看到它的内容。

$

cat .git/ORIG_HEAD

79768b891f47ce06f13456a7e222536ee47ad2fe

我们可以使用 reset 命令,正如前面所述,它返回指向到原始的链。然后它的历史将是如下的这样:

$

git log --oneline feature

79768b8 C5

000f9ae C3

259bf36 C2

f33ae68 C1

5043e79 C0

在 reflog 中是获取这些信息的另外一个地方。reflog 是你本地仓库中相关切换或更改的详细描述清单。你可以使用

git reflog 命令去查看它的内容:

$

git reflog

79768b8 HEAD@{0}: reset: moving to 79768b

c4533a5 HEAD@{1}: rebase finished: returning

to refs/heads/feature

c4533a5 HEAD@{2}: rebase: C5

64f2047 HEAD@{3}: rebase: C3

6a92e7a HEAD@{4}: rebase: checkout master

79768b8 HEAD@{5}: checkout: moving from feature

to feature

79768b8 HEAD@{6}: commit: C5

000f9ae HEAD@{7}: checkout: moving from master

to feature

6a92e7a HEAD@{8}: commit: C4

259bf36 HEAD@{9}: checkout: moving from feature

to master

000f9ae HEAD@{10}: commit: C3

259bf36 HEAD@{11}: checkout: moving from master

to feature

259bf36 HEAD@{12}: commit: C2

f33ae68 HEAD@{13}: commit: C1

5043e79 HEAD@{14}: commit (initial): C0

你可以使用日志中列出的、你看到的相关命名格式,去重置任何一个东西:

$

git reset HEAD@{1}

一旦你理解了当“修改”链的操作发生后,Git 是如何跟踪原始提交链的基本原理,那么在 Git 中做一些更改将不再是那么可怕的事。这就是强大的

Git 的核心能力之一:能够很快速、很容易地尝试任何事情,并且如果不成功就撤销它们。

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

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

相关文章

u盘复制到计算机的文档打不开怎么办,从电脑复制到U盘的文件打不开该怎么处理...

首先我们来看看,怎样的操作会让复制到U盘的文件无法打开?一种操作是,打开电脑文件夹,在文件上点右键,选“发送到-桌面快捷方式”。这样,在电脑桌面上就出现了一个文件的快捷方式。2、桌面上新建立的快捷方式…

深入浅出:Go 语言中值传递与引用传递的原理解析

深入浅出:Go 语言中值传递与引用传递的原理解析 引言Go 语言中的值传递什么是值传递?Go 语言中值传递的工作原理代码示例 Go 语言中的引用传递什么是引用传递?Go 语言中引用传递的工作原理代码示例 值传递与引用传递的比较优势和劣势应用场景…

arcgis显示后台错误_死亡、税收和Esri ArcGIS 999999错误:如何修复

死亡、税收和Esri ArcGIS 999999错误:如何修复如何修复Esri 999999错误生活中有些事情是确定的。在Arcgis,是 Esri 999999 error。基本上,当Arcgis不能指定导致错误的原因时,它会发出这个一般性错误。也就是那个让你们都泪流满面的…

专科学数控还是计算机,盘点适合专科男生学的专业 哪些专业好就业

正所谓:男怕入错行,女怕嫁错郎。对于专科男生来说,哪些专业好就业呢?下面和小编一起来看看吧!1、数控加工专业随着数控制造增多,我国对于数控加工专业人才严重缺乏。选择学数控加工专业的专科男生在毕业后&…

finditerable 转list_Iterable/Iterator 转 list

先简单介绍一下iterable和iterator:iterator为Java中的迭代器对象,是能够对List这样的集合进行迭代遍历的底层依赖。而iterable接口里定义了返回iterator的方法,相当于对iterator的封装,同时实现了iterable接口的类可以支持for ea…

牛顿莱布尼茨计算机公式,牛顿莱布尼茨公式

《牛顿莱布尼茨公式》由会员分享,可在线阅读,更多相关《牛顿莱布尼茨公式(17页珍藏版)》请在人人文库网上搜索。1、装订线教学过程1、复习旧知识,引入课题(1)复习:定积分的概念及几何意义原函数的概念导数的定义(2)课题引入&#…

ap设置 维盟660g_New丨维盟双频百兆11ac入墙AP:WAP-3018穿墙效果不一样!

新的9月,维盟新品bulingbuling闪亮登场看这里 维盟WAP-3018WAP-3018是一款入墙式无线AP,64M内存,8M闪存,支持智能无线技术,2.4G和5G双频并发,无线传输速率1167Mbps,带功率放大器,穿墙…

研究生夏令营计算机题目,2017计算机学科夏令营上机考试-B编码字符串

EF里单个实体的增查改删以及主从表关联数据的各种增删 改查本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表 ...简单而又复杂的…

hive 十六进制转十进制_hive 常用运算

第一部分&#xff1a;关系运算Hive支持的关系运算符•常见的关系运算符•等值比较: •不等值比较: <>•小于比较: <•小于等于比较: <•大于比较: >•大于等于比较: >•空值判断: IS NULL•非空判断: IS NOT NULL•LIKE比较: LIKE•JAVA的LIKE操作: RLIKE•R…

红米note2能刷机没显示无服务器,红米note2怎么刷机 红米note2刷机教程

大家应该知道吧!现在手机市场已经被智能手机垄断了&#xff0c;走到哪儿智能手机都跟我们形影不离。虽然像三星、 苹果 一样的大牌手机比较出名&#xff0c;但是我们的国产手机这几年发展的也是很不错的&#xff0c;就好比国内最火爆的 小米 手机&#xff0c;这个品牌的手机上市…

all any 或 此运算符后面必须跟_any和all组合运算符用法区别

Any、All与&gt、&lt、、组合和In的意义、用法的区别SELECT * FROM ORDERSWHERE EXISTS(SELECT *FORM ORDERSWHERE NAME#SB)这样会返回orders里面所有的值&#xff0c;而不是只有NAME#SB的值改成SELECT * FROM ORDERS O1WHERE EXISTS(SELECT *FORM ORDERS O2WHERE O1.NA…

css控制的代码,通过CSS控制把网页上的代码美化

博客发布文章时&#xff0c;如果文章里有代码块的&#xff0c;通过pre或者code可以让代码块更好美观&#xff1b;有效提升阅读感受。它就像是IDE工具里的主题一样&#xff0c;看着眼睛舒服&#xff1b;这个问题困扰了我很久&#xff0c;由于时间的问题&#xff0c;一直没解决。…

花瓣长度和花瓣宽度散点图鸢尾花_基于python的鸢尾花简单聚类模型分析

1、导入数据#导入花萼数据 from sklearn.datasets import load_iris irisload_iris() iris.data前四列为花萼长度&#xff0c;花萼宽度&#xff0c;花瓣长度&#xff0c;花瓣宽度等4个用于识别鸢尾花的属性2、建模#创建kmeans聚类 from sklearn.cluster import KMeans kmeansKM…

ajax结构图,Vuex结构图及用法

Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。Vuex结构图下图是我总结的Vuex结构图。Vuex用法以一个Vue项目中的商家信息搜索功能为例&#xff0c;记录Vuex的使…

安卓设备门禁识别开发_基于android手机的视频通话门禁控制系统

龙源期刊网http://www.qikan.com.cn基于android手机的视频通话门禁控制系统作者&#xff1a;陆海李登辉来源&#xff1a;《科教导刊电子版》2017年第34期摘要如今门禁系统只能在固定的硬件设备进行对讲&#xff0c;智能化水平不高&#xff0c;且不能实现远距离操作&#xff0c;…

qq饥荒联机版服务器没有响应,饥荒联机版专用服务器卡顿原因及解决方法汇总...

饥荒联机版中自己的专用服务器会经常卡顿&#xff0c;那么是什么原因造成的呢?相信很多玩家都不太了解&#xff0c;下面带给大家的是饥荒联机版专用服务器卡顿原因汇总。饥荒联机版专用服务器卡顿原因汇总①猪人兔人鱼人房卡顿等级:高 解决难度:低普通服务器地上同屏可以放20个…

ajax php 返回数组并父子给变量,将字符串变量从PHP发送回数组变量的ajax ...?

我想将一条消息保存在PHP变量中&#xff0c;并用已返回的其他数组变量发回。例如&#xff0c;我在PHP代码中发生了一些错误检查&#xff0c;并想要一个字符串变量&#xff0c;并将特定的消息发送回我的javascript中使用。将字符串变量从PHP发送回数组变量的ajax ...&#xff1f…

类似endnote_求推荐一款文献管理软件?

科研路漫漫&#xff0c;勤勤恳恳查好了文献&#xff0c;辛辛苦苦做完了实验&#xff0c;磕磕绊绊写好了论文……这参考文献怎么回事&#xff0c;怎么插入进去就乱码&#xff0c;引用这些文献还得一个个改格式&#xff0c;中间插入新文献还要一个个调整顺序&#xff1f;这都不是…

服务器系统崩溃文件系统损坏,explorer启动崩溃,提示文件系统错误-2147219200

您好&#xff0c;了解到您在使用时遇到问题。请问您能否进入带网络的安全模式&#xff1f;您可以在锁屏界面长按Shift&#xff0c;同时点击电源-重启&#xff0c;进入WinRE界面&#xff0c;点击疑难解答-高级选项-启动设置-重启&#xff0c;然后按下F5进入带网络的安全模式。然…

react把表格渲染好ui_react 入坑笔记(五) - 条件渲染和列表渲染

条件渲染和列表渲染一、条件渲染条件渲染较简单&#xff0c;使用 JavaScript 操作符 if 或条件运算符来创建表示当前状态的元素&#xff0c;然后让 React 根据它们来更新 UI。贴一个小栗子&#xff1a;function UserGreeting(props) {return 欢迎回来!;}function GuestGreeting…