Git简明教程--5.文件撤销和版本撤销操作

1.暂存区文件的移除

当我们使用git add 将未追踪或者修改后的文件添加到暂存区以后,想要从暂存区移除该文件,我们使用git rm fileName --cached命令

这里写图片描述

针对上图做一些解释

  1. 首先我们修改了一个已经存在暂存区的文件 newFile2

  2. 然后执行git rm fileName --cached命令,删除了暂存区中的该文件,但是因为使用了-- cached参数,Git不会删除工作目录下的该文件。

  3. 我们再使用git status命令,会发现该文件已处于未跟踪状态

    也就是说,该文件被从暂存区移除,但是依旧存在于工作目录,所以Git会认为它是一个新文件,所以是未跟踪状态。

当然,我们也可以使用git rm fileName -f 命令,将文件从暂存区和工作目录一并删除。

这里写图片描述

可以看到暂存区文件处于删除状态,而且工作目录下该文件已经被删除。

只要记住一点 git rm 命令会从暂存区删除文件

2.工作目录下文件的移除和恢复

我们可以手工删除工作目录下的文件

这里写图片描述

当我们在操作系统中删除了工作目录下的文件以后,使用git status会提deleted信息,但很明显,这个文件依旧存在于暂存区中,如果要将其从暂存区也删除,使用git rm 命令。

但是如果误删工作目录下文件,我们就可以从暂存区恢复该文件,使用git checkout -- fileName命令,改名了会从暂存区恢复这个文件(无论是删除还是更改了内容都可恢复)

这里写图片描述

可以看到已经删除的文件已经被恢复。

同时如果我们修改了该文件,但没有add到暂存区,我们也可以使用git checkout -- fileName恢复到暂存区中的文件内容。

这里写图片描述

对上图进行一些解释:

  1. 首先我们修改了newFile2的内容

  2. 然后使用git status查看,发现该文件处于修改状态,但并没有被add到暂存区

  3. 使用 git checkout -- newFile2从暂存区恢复了此文件内容

  4. 使用git status 发现工作目录和暂存区完全一致(因为文件已经恢复到暂存区的状态)

只要记住一点,git checkout --fileName命令会从暂存区恢复文件到工作目录

3.重新提交(修改最后一次提交)

我们新建了一个文件 newFile3

然后我们使用了git commit命令将暂存区文件提交到版本仓库(repository)以后,如果对该次提交不满意或者有修改,可以使用 git commit --amend 进行修改。

先使用git commit -m"第二次提交",然后使用git log

这里写图片描述

这时我们使用 git commit --amend -m"第二次重新提交"

这里写图片描述

可以发现已经修改了提交的内容(包括文件和各种信息)

4.版本切换

使用git reset 版本校验和缩写命令可以进行版本的切换

首先我们要清楚地是,Git中版本快照的存储,是一个线性的列表

这里写图片描述

每一个结点对应一个commit的版本快照(snapshot),同时git默认的分支名为master(主分支),我们可以先不用理解什么是分支。而同时,又存在一个HEAD指针指向当前分支的当前版本

这里写图片描述

这是我们就可以使用git reset 版本校验和缩写 的命令,来更改版本(Git并不推荐)

例如使用git reset HEAD^ ,就可以退回到上一个版本,HEAD^指针就代表上一个版本的版本校验和缩写

这里写图片描述

可以看到暂存区已经退回了上一个版本的版本内容,但是工作目录并没有改变,因此新建的文件newFile3会被提示未追踪。

这时使用git log命令会发现只剩第一次的版本提交信息。

这里写图片描述

但是我们如果要回到最新的版本,我们发现在git log中是没有下一次更新的信息的(历史记录是没有未来的),我们可以使用git reflog

这里写图片描述

可以看到所有版本的校验和缩写,我们回到第二次重新提交以后的暂存区。

这里写图片描述

可以看到确实已经切换到了第二次重新提交的版本。

廖雪峰廖大制作的一个小视频可能会更容易理解一些点击观看

要清楚的是:

  1. git reset 版本校验和缩写会使暂存区变为该版本的目录文件结构,也就相当于跳转到某个版本。

  2. HEAD指针指向当前版本的版本快照,HEAD^指向上一个版本的版本快照。

  3. git reset HEAD 可以将暂存区的一切操作恢复到原来状态(还没有commit)的情况下。

  4. git reset HEAD^ 可以将暂存区恢复到上个版本快照的状态。

  5. git reset不会影响Git仓库中的版本快照链表,只会移动HEAD指针,并且将暂存区恢复到快照状态。

5.撤销已经暂存的文件

这一个命令其实基于版本切换的命令

当暂存区的文件被修改以后,我们可以使用如下命令恢复暂存区中的这个文件

git reset HEAD fileName

理解了版本切换,就很容易理解这个命令,git reset HEAD 是将暂存区恢复到当前版本的版本快照,后跟fileName 就会恢复特定的文件,也就是说这个命令其实是git reset 的一个特殊形式


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值