Day14|【Git】档案管理 - 档案还原 git reset

上篇介绍 git checkout 是还原档案内容,那麽 git reset 的功能是什麽呢?


git reset

指令功能:还原「档案状态

使用 git reset 指令之前,要先了解 reset 的意思。从英文翻译来看 reset 代表的是重新设定,但其实在中文解释里「前往」、「变成」,会较符合该指令的用途,所以注意别被误导罗!

👉 reset → go to / become

git reset 的基本观念:

  1. 常搭配参数使用。常见的三种参数:mixed 、 soft 、 hard
  2. 有「相对」与「绝对」的做法
  3. 与档案状态有关,操作此指令并不是代表把原本的 Commit 移除,而是前往到某次的 Commit 状态。

📖 常用情况:将已预存的档案移出预存区

情境|假设今天修改两份档案,想要分别提交它们,却不小心,却不小心使用 git add * 将两者都加至暂存区。如果想要把其中一个档案移出预存区(unstage),我们可以怎麽做呢?

🛠 实际操作

  1. 分别新增两个档案,内容自由编辑

    $ touch index1.html # 新增 index1.html 档案
    $ touch index2.html # 新增 index2.html 档案
    

    https://ithelp.ithome.com.tw/upload/images/20210928/201410100W4TcdtshM.png

  2. 此时我误用了 git add * 指令将两个档案都上传,并查看状态

    $ git add * # 将所有档案全部加至暂存区 ( * 代表全部)
    $ git status # 检查档案状态
    

    https://ithelp.ithome.com.tw/upload/images/20210928/20141010FFGvo9zDy5.png

    档案状态显示:Changes to be committed(new file)可以看到两个档案都被加至暂存区,但这跟我本来想要分别 Commit 的预设不同,所以希望可以将其中一个移除暂存区。

    红色底线的文字讯息:use "git reset HEAD ..." to unstage

    便是提示说使用 "git reset HEAD ..." 将档案放回 unstage 。

  3. 输入 git reset 指令,并查看状态。

    $ git reset HEAD index2.html # 还原 index2.html 档案状态(使档案回到前一个状态)
    // git reset HEAD + [档案名称]
    

    https://ithelp.ithome.com.tw/upload/images/20210928/20141010jNX20YjEbw.png

    现在暂存区里只有 index1.html 档案,而 index2.html 的档案状态则变成未追踪(Untracked files)的状态。

  4. 将档案提交至储存区 git commit -m

    https://ithelp.ithome.com.tw/upload/images/20210928/20141010KLxziLVHz1.png

    只有 index1.html 档案被提交啦!达到原本想做的效果了~


# 相对路径 / 绝对路径

首先「绝对路径」,是指你很清楚你要还原哪一个版本,知道 Commit 编号,那麽可以直接指定要还原那个版本档案。

$ git reset [Commit 的 SHA-1 编号] # 还原指定的 Commit

相对路径

首先先使用 git log --online 指令来检视目前的 Git 纪录。

$ git log --online # 检视 Git 纪录(简单一行形式)

https://ithelp.ithome.com.tw/upload/images/20210928/20141010L3r3ECXAex.png

上图部分可以看到我们目前有三个 Commit 版本,而 HEAD 与 master 都刚好同时指向 3f2ed7a 这个版本。

假设今天想要还原到 a8bf179 这个版本,那麽有以下几种方式,都是以「相对路径」的概念进行。

  • git reset 3f2ed7a^
  • git reset master^
  • git reset HEAD^

^ 符号代表「前一次」的意思。

因此 3f2ed7a^ 代表 3f2ed7a 的前一个。而因为 master 与 HEAD 也都刚好指向 3f2ed7a ,所以我们也可以使用 master 或 HEAD 来进行相对路径的方式指定还原到哪个版本。


说明 git reset HEAD <file>

根据 HEAD ( 最後提交的 patch ) 来还原 file 的「档案状态」。

参考文章:档案还原

⚠️ 只会还原「档案状态」,而不是还原档案的「内容」

file 是用来指定还原某档案,如没有指定何者档案,则会默认为还原所有档案。

$ git reset HEAD <file>     # 还原「指定」的档案状态
$ git reset HEAD            # 还原「全部」的档案状态

git reset 会改变档案的档案状态,使用时机用於想要更改 master 或是暂存区的资料。但这里要特别注意的是,如果对於 git reset 指令还不够熟悉,最好别随便使用,一旦 master 被移动,很容易很容易找不到原来的档案。

建议使用时机:

  1. git add 加到不想要的档案,想从暂存区移除掉
  2. 已经 Commit 後的档案,发现有地方想修改或者有问题要修改

总结 |可以清除过去的纪录,负责移动 HEAD 和 master 的指令。


<<:  [Lesson13] OkHttp

>>:  Day 14 依个资隐私架构如何实作个资保护

【零基础成为 AI 解梦大师秘笈】Day28 - 周易解梦之人工智慧(9)

人工智慧9 前言 系列文章简介 大家好,我们是 AI . FREE Team - 人工智慧自由团队,...

[03] 建立 telegram 机器人

建立一个 telegram bot 打开 telegram 搜寻 BotFather 然後装好ngr...

Day 8 超多的范例?怎麽办呢?

该文章同步发布於:我的部落格 昨天我们做了一个关於汉堡种类的测试,但真正的测试怎麽可能这麽少呢! ...

[Day6] Git版本控制 - 基本操作篇 (MacOS)

搞定 Mac 的软件和终端机,接下来要学习一步步把其他工具的使用环境建立起来,并学习如何去运用。 1...

[重构倒数第10天] - 行动装置上面的 Touch 跟 Click

前言 该系列是为了让看过Vue官方文件或学过Vue但是却不知道怎麽下手去重构现在有的网站而去规画的系...