美文网首页
【学了就忘】Git后悔药 — 33.版本回退操作(二)

【学了就忘】Git后悔药 — 33.版本回退操作(二)

作者: 繁华似锦Fighting | 来源:发表于2021-05-15 00:18 被阅读0次

    (2)git reset --mixed命令

    git reset --mixed commit-id命令:回退到指定版本。(soft:混合的,即:中等回退。)

    该命令不仅修改了分支中HEAD指针的位置,还将暂存区中数据也回退到了指定版本。

    但是工作区中的版本仍是回退前的版本。

    --mixed参数是git reset命令的默认选项。

    示例开始:

    首先在版本库中的readme.txt文件中添加一行内容,并提交该内容。我们的目的就是要再回退到该版本。

    1)查看本地版本库日志

    # 1.使用git log查看历史版本记录
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git log --oneline
    bcd2726 (HEAD -> master) 第3次提交,新增内容:readme.txt file v3
    b2de20c 第2次提交,新增内容:readme.txt file v2
    40212c3 第1次提交,创建readme.txt文件
    
    # 2.使用git reflog查看历史版本记录
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git reflog
    bcd2726 (HEAD -> master) HEAD@{0}: commit: 第3次提交,新增内容:readme.txt file v3
    b2de20c HEAD@{1}: commit: 第2次提交,新增内容:readme.txt file v2
    40212c3 HEAD@{2}: commit (initial): 第1次提交,创建readme.txt文件
    
    # 3.查看readme.txt文件的内容
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ cat readme.txt
    readme.txt file v1
    readme.txt file v2
    readme.txt file v3
    

    2)向readme.txt文件中新增一行数据,并提交到本地版本库

    # 1.新增数据
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ echo "readme.txt file v4" >> readme.txt
    
    # 2.查看readme.txt文件内容
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ cat readme.txt
    readme.txt file v1
    readme.txt file v2
    readme.txt file v3
    readme.txt file v4
    
    # 3.提交到本地版本库
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git commit -a -m '第4次提交,新增内容:readme.txt file v4'
    warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory
    [master 68701fc] 第4次提交,新增内容:readme.txt file v4
     1 file changed, 1 insertion(+)
    
    # 4.现在查看此时本地版本库日志
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git log --oneline
    68701fc (HEAD -> master) 第4次提交,新增内容:readme.txt file v4
    bcd2726 第3次提交,新增内容:readme.txt file v3
    b2de20c 第2次提交,新增内容:readme.txt file v2
    40212c3 第1次提交,创建readme.txt文件
    

    3)现在比对工作区与暂存区、暂存区与本地版本库的差异

    # 1.比对工作区与暂存区中文件的差异
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git diff readme.txt
    
    # 2.比对暂存区与本地版本库中文件的差异
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git diff --cached readme.txt
    

    我们可以看到此时,工作区、暂存区与本地版本库中的readme.txt文件状态无差异。

    4)开始回退操作,退回到V3版本

    使用git reset --mixed HEAD^命令,退回到前一个版本。

    # 回退一个提交版本
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git reset --mixed HEAD^
    Unstaged changes after reset:
    M       readme.txt
    

    说明:

    • Unstaged changes after reset:意思是回退后,有为被追踪的文件。
    • M readme.txt:表示readme.txt文件修改后,未被追踪,也就是修改后未添加到暂存区的状态。

    这里也就说明了,暂存区中readme.txt文件被回退了。我们还是继续按步骤往下演示。

    5)回退后,对比工作区、暂存区与本地库中版本中文件的差异

    # 1.比对工作区与暂存区中文件的差异
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git diff readme.txt
    warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory
    diff --git a/readme.txt b/readme.txt
    index 1e6534a..47b238c 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -1,3 +1,4 @@
     readme.txt file v1
     readme.txt file v2
     readme.txt file v3
    +readme.txt file v4
    
    # 2.比对暂存区与本地版本库中文件的差异
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git diff --cached readme.txt
    
    # 3.比对工作区与本地版本库中文件的差异
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git diff HEAD readme.txt
    warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory
    diff --git a/readme.txt b/readme.txt
    index 1e6534a..47b238c 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -1,3 +1,4 @@
     readme.txt file v1
     readme.txt file v2
     readme.txt file v3
    +readme.txt file v4
    

    回退后,我们再次对比了工作区、暂存区与本地库中版本中文件的差异:

    • 发现工作区与暂存区内容出现了差异,
    • 暂存区与本地库中的版本没有差异,
    • 工作区与本地库中的版本出现了差异。

    说明:工作区中的内容没有回退,但是暂存区和本地库中的内容回退到了之前的版本。(重要)

    6)查看本地版本库的提交日志信息

    # 1.使用git log查看历史版本记录
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git log --oneline
    bcd2726 (HEAD -> master) 第3次提交,新增内容:readme.txt file v3
    b2de20c 第2次提交,新增内容:readme.txt file v2
    40212c3 第1次提交,创建readme.txt文件
    
    # 2.使用git reflog查看历史版本记录
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git reflog
    bcd2726 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
    68701fc HEAD@{1}: commit: 第4次提交,新增内容:readme.txt file v4
    bcd2726 (HEAD -> master) HEAD@{2}: commit: 第3次提交,新增内容:readme.txt file v3
    b2de20c HEAD@{3}: commit: 第2次提交,新增内容:readme.txt file v2
    40212c3 HEAD@{4}: commit (initial): 第1次提交,创建readme.txt文件
    

    从上我们可以看到:(重点)

    • 使用git log命令查看历史版本记录,发现已经看不到第4次提交了。
    • 使用git reflog命令查看历史版本记录,第四次提交这个版本仍然存在的。

    7)恢复到回退前版本

    上面说了,使用git reset --mixed命令回退,做了两个操作

    1. 移动HEAD指针(版本库的回退)。
    2. 暂存区的内容也回退到HEAD指针指向的版本。

    而工作区内容不回退。

    我们现在来查看一下工作目录中的文件状态。

    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:   readme.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    我们可以看到readme.txt文件是修改未暂存状态。

    所以若要恢复到回退之前的版本,也是两种方式:

    1. 把工作区的readme.txt文件添加到暂存区,在commit提交到本地版本库中。
    2. 使用git reset --mixed 68701fc命令,退回到第四次提交版本。

    提示(重要):就本例而言,虽然可以通过先add到暂存区,再commit提交到本地版本库的方式,就可以恢复回退前的版本。但若回退的版本是很多版本之前的版本,最好不要使用该方式,而是使用版本跳转命令的方式(也就是第二种方式)。

    第一种常规操作,这里就不演示了。下面演示一下第二种方式:

    # 1.查看可回退的历史版本
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git reflog
    bcd2726 HEAD@{1}: reset: moving to HEAD^
    68701fc (HEAD -> master) HEAD@{2}: commit: 第4次提交,新增内容:readme.txt file v4
    bcd2726 HEAD@{3}: commit: 第3次提交,新增内容:readme.txt file v3
    b2de20c HEAD@{4}: commit: 第2次提交,新增内容:readme.txt file v2
    40212c3 HEAD@{5}: commit (initial): 第1次提交,创建readme.txt文件
    
    # 2.回退到第四次提交
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git reset --mixed 68701fc
    
    # 3.查看工作目录中文件状态
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git status
    On branch master
    nothing to commit, working tree clean
    
    # 4.查看版本历史
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git log --oneline
    68701fc (HEAD -> master) 第4次提交,新增内容:readme.txt file v4
    bcd2726 第3次提交,新增内容:readme.txt file v3
    b2de20c 第2次提交,新增内容:readme.txt file v2
    40212c3 第1次提交,创建readme.txt文件
    
    # 5.查看可回退的历史版本
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ git reflog
    68701fc (HEAD -> master) HEAD@{0}: reset: moving to 68701fc
    bcd2726 HEAD@{1}: reset: moving to HEAD^
    68701fc (HEAD -> master) HEAD@{2}: commit: 第4次提交,新增内容:readme.txt file v4
    bcd2726 HEAD@{3}: commit: 第3次提交,新增内容:readme.txt file v3
    b2de20c HEAD@{4}: commit: 第2次提交,新增内容:readme.txt file v2
    40212c3 HEAD@{5}: commit (initial): 第1次提交,创建readme.txt文件
    
    # 6.查看readme.txt内容
    L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
    $ cat readme.txt
    readme.txt file v1
    readme.txt file v2
    readme.txt file v3
    readme.txt file v4
    

    我们查看到,readme.txt文件的内容已经完全恢复。

    相关文章

      网友评论

          本文标题:【学了就忘】Git后悔药 — 33.版本回退操作(二)

          本文链接:https://www.haomeiwen.com/subject/whtblltx.html