git场景化操作(二): 取消变更与回滚

461 阅读3分钟

暂存区恢复至HEAD

当我们需要丢弃暂存区中的改动时,可以使用reset命令进行回滚

> echo "eeee" >> demo.html  # 修改文件
> git add -u   # 添加至暂存区
> git status   # 查看当前状态,可以发现demo.html文件已加入暂存区,等待提交

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   demo.html

> git reset HEAD   # 恢复暂存区至HEAD(即放弃暂存区中的改动)
Unstaged changes after reset:
M	demo.html

> git status   #再次查看状态,可以发现刚刚添加到暂存区的改动已经回滚,且文件处于待提交至暂存区的状态
# 即回到了执行git add之前的状态
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   demo.html

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

reset命令也可以在后面跟上具体的文件名指定要对哪些文件进行回滚操作 git reset HEAD <file>

reset命令的其他使用场景

git reset 有三个参数
--soft 这个只是把 HEAD 指向的 commit 恢复到你指定的 commit,暂存区 工作区不变
--hard 这个是 把 HEAD, 暂存区, 工作区 都修改为 你指定的 commit 的时候的文件状态
--mixed 这个是不加时候的默认参数,把 HEAD,暂存区 修改为 你指定的 commit 的时候的文件状态,工作区保持不变

恢复工作区至暂存区

当我们需要将工作区的内容恢复至暂存区时,可以使用checkout命令

> git status   #首先还是查看下当前git仓库的状态
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   demo.html

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

可以发现当前工作区有一个改动尚未提交至暂存区,当我们想将其放弃时,可以如下操作

> git checkout -- demo.html

> git status
On branch master
nothing to commit, working tree clean

操作后可以看到工作区的修改已经被恢复至于暂存区一致的状态

恢复HEAD至之前某一次commit的状态

当我们想要放弃当前分支上的几次提交时,可以使用reset命令的 --hard命令

首先查看当前的commit记录

commit 83bc3c142f7dfda3dd2cae387b69bd7c7162d9b0
Author: your name <your@email.com>
Date:   Sun Dec 20 00:44:59 2020 +0800

    test commit

commit 20bbb14ede2297040f0d08fdde9712d80aea6984
Author: your name <your@email.com>
Date:   Sun Dec 13 19:02:57 2020 +0800

    commbo commit

    add demo.html and modify readme has been changed again!

    modify demo.html

commit 84ed89a79f290cbdab68bdc9468859a05d9fac77
Author: your name <your@email.com>
Date:   Sun Dec 13 18:57:21 2020 +0800

    init proj

当我们想要将commit回退至中间一次的提交(即放弃最后一次commit)时,可以如下操作

> git reset --hard 20bbb14ede   # 将分支回退会指定的commit

> git log   # 再次查看commit记录,可以发现最后一次的commit已经被丢弃了,HEAD回到了我们指定的位置
commit 20bbb14ede2297040f0d08fdde9712d80aea6984
Author: your name <your@email.com>
Date:   Sun Dec 13 19:02:57 2020 +0800

    commbo commit

    add demo.html and modify readme has been changed again!

    modify demo.html

commit 84ed89a79f290cbdab68bdc9468859a05d9fac77
Author: your name <your@email.com>
Date:   Sun Dec 13 18:57:21 2020 +0800

    init proj

要注意,reset --hard是十分危险的行为,除非明确要放弃某些改动,不然不要轻易使用,丢失的代码是无法恢复的!