美文网首页
讓你的代碼回到過去,git reset 與 git revert

讓你的代碼回到過去,git reset 與 git revert

作者: Guohanzhong | 来源:发表于2018-03-04 18:55 被阅读0次

    先简单了解档案存入 repository(仓库)的流程

    Git 简单来说分为三个区域:

    1、工作区(working directory): 我们实际操作的资料夹(档案)

    2、暂缓区(stage snapshot): 将工作区档案的快照新增到暂存区域

    3、git 目录(.git directory): 提交暂存区域的档案快照永久地储存在 Git 目录

    git 流程

    git reset --hard and --soft 穿梭你提交的版本之间

    • hard
      git reset --hard HEAD :此种模式完全不保留原始 commit 结点的任何资讯,会连同资料夹中实体档案内容都进行重置,也就是直接将工作区、暂缓区及 git 目录都重置成目标Reset结点的资料内容。

    具体操作:

    回复到上一个(或更前的)版本。
    git reset --hard HEAD 回复到最新提交版本
    git reset --hard HEAD~ // 等于 ~1 回复到上一个提交版本
    git reset --hard HEAD~n // n 等于往上第几个提交版本 回复之前指定的提交版本

    例子一:

    假设我发现最新的代码版本有bugs,想回复更前的版本,你可以输入:
    git log --oneline -n // (n 是最近几多次的提交记录)
    如下所示,便会显示最近5次的提交记录。

    Kwokde-MacBook-Pro:test stevechung$ git log --oneline -5 // 最近5次提交记录
    ba2f0a4 (HEAD -> master, origin/master) test4 //最新提交的记录
    f3a6683 test1 // 上一个提交的记录
    4f0f054 test2
    6fefa2d test1
    77f9ec8 reset
    

    如果你想回复到 f3a6683 test1 ,输入 git reset --hard HEAD~
    如果你想回复到 4f0f054 test2 ,输入 git reset --hard HEAD~2
    如果你想回复到 6fefa2d test1 ,输入 git reset --hard HEAD~3
    如此类推。

    假设我回复到 4f0f054 test2 这个版本,输入后便会显示:

    Kwokde-MacBook-Pro:test stevechung$ git reset --hard HEAD~2 // 回复到 4f0f054 test2
    HEAD is now at 4f0f054 test2 // 这代表成功回复至你指定的版本
    

    小知识:HEAD 是什么 ?
    HEAD 是一个指标,指向某一个分支,通常你可以把 HEAD 当做「目前所在分支」看待。

    假设你回复之前的版本后,又想回复到最新提交的版本,就可以用:

    • git reflog :查看所有讯息版本
    • git reset --hard commit_id : 根据 commit id 回复到指定版本
    例子二:

    你可以输入 git reflog 查看所有讯息版本,如下所示:

    Kwokde-MacBook-Pro:test stevechung$ git reflog // 查看所有讯息版本
    4f0f054 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~2 // 这是例子一、回复的当前提交记录
    ba2f0a4 (origin/master) HEAD@{1}: commit: test4 // 假设你要回复到例子一、开头使用的这个版本
    f3a6683 HEAD@{2}: commit: test1
    4f0f054 (HEAD -> master) HEAD@{3}: commit: test2
    6fefa2d HEAD@{4}: commit: test1
    77f9ec8 HEAD@{5}: commit: reset
    58f0631 HEAD@{6}: reset: moving to HEAD
    58f0631 HEAD@{7}: commit (initial): gitreset
    

    ba2f0a4 就是 commit id,每个经 git commit -am "" 提交到历史记录区(仓库)都会生成一组 commit id,可以按以下输入:

    Kwokde-MacBook-Pro:test stevechung$ git reset --hard ba2f0a4 //回复到的指定commit id 的提交记录版本
    HEAD is now at ba2f0a4 test4 // 这代表成功回复至你指定的版本
    
    • soft
      git reset --soft HEAD / commit id :此模式下会保留工作区资料内容,不会异动到目前所有的实体档案内容;也会保留暂缓区资料内容,让暂缓区与 git 目录资料内容是一致的。

    具体操作:

    Kwokde-MacBook-Pro:test raykwok$ git reflog // 查看所有讯息版本
    ba2f0a4 (HEAD -> master, origin/master) HEAD@{0}: reset: moving to ba2f0a4
    4f0f054 HEAD@{1}: reset: moving to HEAD~2
    ba2f0a4 (HEAD -> master, origin/master) HEAD@{2}: commit: test4
    f3a6683 HEAD@{3}: commit: test1
    4f0f054 HEAD@{4}: commit: test2
    6fefa2d HEAD@{5}: commit: test1 // 计划回复到前 3 个版本 - 6fefa2d
    77f9ec8 HEAD@{6}: commit: reset
    58f0631 HEAD@{7}: reset: moving to HEAD
    58f0631 HEAD@{8}: commit (initial): gitreset
    
    Kwokde-MacBook-Pro:test raykwok$ git reset --soft HEAD~3 // 回复到 6fefa2d 版本
    Kwokde-MacBook-Pro:test raykwok$ git reflog
    6fefa2d (HEAD -> master) HEAD@{0}: reset: moving to HEAD~3 // 回复成功
    ba2f0a4 (origin/master) HEAD@{1}: reset: moving to ba2f0a4
    4f0f054 HEAD@{2}: reset: moving to HEAD~2
    ba2f0a4 (origin/master) HEAD@{3}: commit: test4
    f3a6683 HEAD@{4}: commit: test1
    4f0f054 HEAD@{5}: commit: test2
    6fefa2d (HEAD -> master) HEAD@{6}: commit: test1
    77f9ec8 HEAD@{7}: commit: reset
    58f0631 HEAD@{8}: reset: moving to HEAD
    58f0631 HEAD@{9}: commit (initial): gitreset
    

    git revert 撤销一个提交的同时会创建一个新的提交。

    • revert
      git revert HEAD 新增一个 Commit 来反转(或说取消)另一个 Commit 的内容,原本的 Commit 依旧还是会保留在历史纪录中。虽然会因此而增加 Commit 数,但通常比较适用于已经推出去的 Commit,或是不允许使用 Reset 或 Rebase 之修改历史纪录的指令的场合。

    具体操作:

    Kwokde-MacBook-Pro:test raykwok$ git revert HEAD~2 // 提交revert 取消上一次提交
    [master 1b6942a] Revert "gitreset" // 增加了一个 Commit 1b6942a 用以代替上次提交的版本
     1 file changed, 0 insertions(+), 0 deletions(-)
     delete mode 100644 README.md
    
    Kwokde-MacBook-Pro:test raykwok$ git reflog
    1b6942a (HEAD -> master) HEAD@{0}: revert: Revert "gitreset" // 增加一个 Commit 来取消 6fefa2d
    6fefa2d HEAD@{1}: reset: moving to HEAD
    6fefa2d HEAD@{2}: reset: moving to HEAD~3
    

    总结:

    本文是小弟学习前端写有关于git reset 与 git revert 的用处,请大家多多指教。如有任何意见及交流,可在下方留言,谢谢!

    相关文章

      网友评论

          本文标题:讓你的代碼回到過去,git reset 與 git revert

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