Git基础学习 — Git中的撤销操作

电脑知识 投稿 59000 0 评论

Git基础学习 — Git中的撤销操作

1、撤销操作说明

我们在使用Git版本管理时,往往需要撤销某些操作。比如说我们想将某个修改后的文件撤销到上一个版本,或者是想撤销某次多余的提交,都要用到Git的撤销操作,因此撤销操作在平时使用中还是比较多的。

本文介绍几种,对于已修改过的文件,需要进行撤销操作,根据修改文件出现的位置,可以分为三种情况:

  1. 仅仅是工作区中内容进行了修改,还未添加到暂存区。

  2. 文件已经添加到暂存区,但是还未提交到本地版本库。

  3. 文件已经提交到本地版本库。

前两种可以叫撤销操作,后面一种叫回退版本,不同的情况具有不同的撤销方式。

下面就撤销操作给出详细的解释。

2、撤销工作区中文件的修改

如果工作区的某个文件被改乱了,但还没有提交,可以用或者命令找回本次修改之前的文件。

前提:文件已在本地版本库中。

(1)修改文件中的内容。

# 1.查看test.txt文件内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ cat test.txt
hello git

# 2.进行修改内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "hello git v2" >> test.txt

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ cat test.txt
hello git
hello git v2

(2)查看工作目录中文件的状态。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

好好的说明一下这些提示信息:

  • :当前工作在主分支上。

  • :暂存区中没有可提交的变化。

  • :可使用该命令把更新添加到暂存区。

  • :丢弃工作区的修改。同命令一样。

  • :可以使用命令添加到暂存区,也可以使用命令直接提交到本地版本库。

Git的命令提示是非常详细的,我们按照提示信息操作就可以。

说明:

老版本Git会提示:

新版本Git会提示:

和命令:

  • 这个命令承担了太多职责,既被用来切换分支,又被用来恢复工作区文件,对用户造成了很大的认知负担。

  • Git社区发布了Git的2.23版本中,有一个特性非常引人瞩目,就是引入了两个新命令 和,用以替代现在的。
    即:Git2.23版本开始,命令可代替命令文件恢复的工作。

(3)撤销工作区中文件的修改。

# 1.使用git restore 命令撤销工作区中的操作
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git restore test.txt

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean

# 2.再次修改test.txt文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "hello git v3" >> test.txt

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

# 使用git checkout命令撤销工作区中的操作
# 撤销操作固定写法“git checkout -- 文件”
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git checkout -- test.txt

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean

说明:命令中的很重要,没有,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到命令。

(4)总结

  1. 和命令原理:
    这里有两种情况:
    一种是自修改后还没有被放到暂存区,现在的撤销修改就回到和版本库一模一样的状态;
    一种是已经添加到暂存区后,又作了修改,现在的撤销修改就回到添加到暂存区后的状态。

  2. 撤销命令是一个危险的命令,这个很重要,你对该文件做的任何修改都会消失。原理是你拷贝了该文件在暂存区或者本地版本库中的副本,来覆盖工作区的该文件。
    即:工作区的文件变化一旦被撤销,就无法找回了,除非你确实不想要这个文件了。

所以我的理解:撤销命令实际的操作是重置(原文件覆盖),而实际的效果上是撤回。

3、撤销暂存区中文件的修改

如果已经把修改的个文件添加到暂存区,可以用下面的命令撤销。

还是以上面文件为例。

(1)修改文件并存储到暂存区。

# 1.修改文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "hello git v4" >> test.txt

# 2.添加文件到暂存区
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git add test.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory

# 3.查看工作目录中文件状态
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   test.txt

说明:

  • :表示暂存区中所做的更改如下,可以提交。

  • :该命令表示取消暂存,把暂存区中的文件撤回到工作区。

Tips:

老版本Git会提示:

新版本Git会提示:

和上面同理:

  • 早期的Git中命令承载了分支操作和文件恢复的部分功能,有点复杂,并且难以使用和学习,所以社区解决将这两部分功能拆分开,Git 2.23.0版本中中引入了两个新的命令和。

  • 早期的Git中,文件恢复涉及到两个命令,一个是命令,一个是命令。命令除了重置分支之外,还提供了恢复文件的能力。

  • 而新的命令,代替了命令和命令(但是这两个命令还可以进行文件恢复),专门用来恢复暂存区和工作区的文件。

(2)撤销暂存区中文件的修改。

1)使用命令撤销暂存区中文件的修改。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git restore --staged test.txt

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

(重点)我们可以看到,文件从暂存区中撤销到工作区中,但是不会撤销工作区中文件的更改。

2)使用命令,不带参数,撤销暂存区中文件的修改。

# 1.文件添加到暂存区中
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git add test.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   test.txt

# 2.使用`git restore`命令,撤销暂存区中文件的修改
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git restore test.txt

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   test.txt

我们可以看到,工作目录中文件状态没有改变,所以要撤销暂存区中文件的修改,必须加上参数。

这是为什么呢?(个人理解)

因为命令,不带参数,背后的执行逻辑是,把暂存中的文件复制一份,覆盖掉工作区的文件,但是这样就形成了文件在工作区和暂存区一样的状态,所以工作区和暂存区的状态也一样。这也就是上面执行完命令,在工作目录文件的状态,没有变化的原因。

3)使用命令撤销暂存区中文件的修改。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git reset HEAD test.txt
Unstaged changes after reset:	# 表示重置后文件未被跟踪
M       test.txt	# M:应该是modified的意思吧

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

我们看到命令的执行效果和命令执行的效果是一样的,这里就不多解释了。

之后要在进行撤销工作区中文件的修改,就和上一步一样了。

4、总结

前面通过详细的步骤,分别演示了从工作区和暂存区做撤销修改的操作。

下面我们总结一下,方便我们对前面知识的理解。

  1. 命令,既可以用来切换分支,又可以用来恢复工作区文件。
    恢复文件命令:

  2. 命令,除了能够重置分支之外,还提供了恢复文件的能力。
    恢复文件命令:

  3. Git 2.23.0版本中,提供了命令,代替了命令和命令的恢复文件功能。(但上面两个命令也能恢复文件)
    修改的文件只在工作区,没有添加到暂存区中,使用命令。
    修改的文件已经添加到暂存区,但还没有提交,使用命令。

在来详细说明一下命令:

这里有两种情况:

一种是自修改后还没有被放到暂存区,现在的撤销修改就回到和版本库一模一样的状态;

又作了修改,现在的撤销修改就回到添加到暂存区后的状态。 而命令:

用于已经把修改的文件添加到暂存区,没有被修改,但还未提交。这时执行该命令,直接撤销暂存区总存储的修改,将文件恢复到工作区去。

编程笔记 » Git基础学习 — Git中的撤销操作

赞同 (73) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽