得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

在 git 中撤销改动

能进就能退,能加就能减,在 git 中熟悉撤销改动的方法必不可缺,在这个全组 git 的现状下,多掌握一项技能,就多了一个装 13 的高光时刻

撤销改动,必须知道的两个工具:reset 和 revert

区别:两者的方向不同,若是以 commit 为线,那么 reset 就是走回头路,而 revert 则是继续向前,只是新 commit 的内容正好和要 revert 的内容相反,抵消要 revert 的内容

进入正题:

1
2
3
4
5
6
# 假设本地有个 git 库,并且有以下提交
$ git log --oneline -4
4f4d141 (HEAD -> master) 4.txt
45dc23b 3.txt
390064f 2.txt
d35f2bc 1.txt

git reset

  1. git reset --soft

    • 有 “最小” 影响,只改变一个符号引用的状态使其指向一个新提交,不会改变其索引和工作目录
    • 软重置,只撤销了 commit 操作,保留了 add 操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ git reset --soft HEAD~1  # 尝试回退一个版本,终端没有输出

    $ git log --oneline -4 # 再次查看当前提交历史,可以看到版本库已经回退了一个版本
    45dc23b (HEAD -> master) 3.txt
    390064f 2.txt
    d35f2bc 1.txt
    ef7b530 test7

    $ git status # 可以看到 SHA1 为 4f4d141 的 commit 上的更改回到了缓存区,如果要继续提交,只需要再次 commit
    On branch master
    Changes to be committed:
    (use "git restore --staged <file>..." to unstage)
    new file: 4.txt
  2. git reset --hard

    • 具有破坏性,是很危险的操作,很容易导致数据丢失
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ git reset --hard HEAD~2
    HEAD is now at 390064f 2.txt

    $ git log --oneline -4 # 可以看到版本库回退了两个版本,并且将本地版本库的头指针全部重置到了指定版本
    390064f (HEAD -> master) 2.txt
    d35f2bc 1.txt
    ef7b530 test7
    4a180d7 test5

    $ git status # 暂存区会被重置
    On branch master
    nothing to commit, working tree clean

    $ ls # 工作区的代码回退到了这一版本
    1.txt 2.txt
  3. git reset --mixed

    • 保留提交的源码改动,只是将索引信息回退到了某一个版本,如果要继续提交,需要再次执行 add 和 commit
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ git reset --mixed HEAD~2  # 尝试回退两个版本,终端没有输出

    $ git log --oneline -4
    390064f (HEAD -> master) 2.txt
    d35f2bc 1.txt
    ef7b530 test7
    4a180d7 test5

    $ git status
    On branch master
    Untracked files:
    (use "git add <file>..." to include in what will be committed)
    3.txt
    4.txt
    nothing added to commit but untracked files present (use "git add" to track)

git revert

  1. git revert

    • 对给定的 commit 提交进行逆过程,该命令会引入一个新的提交来抵消给定提交的影响,不修改版本库的现存历史记录,相反它只会在记录添加新的提交
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ git revert HEAD --no-edit  # 撤销最近的一次提交
    Removing 4.txt
    [master 309561a] Revert "4.txt"
    Date: Fri Nov 13 18:02:35 2020 +0800
    1 file changed, 0 insertions(+), 0 deletions(-)
    delete mode 100644 4.txt

    $ git log --oneline -4 # 看到想要撤销 4f4d141 的 commit(4.txt)记录还在,并且多了一个 309561a 新的 commit(Revert "4.txt")
    309561a (HEAD -> master) Revert "4.txt"
    4f4d141 4.txt
    45dc23b 3.txt
    390064f 2.txt

be yourself, everyone else is already taken.