git后悔药之如何回滚

预备知识
git将项目的存储分为4部分,每部分有自己作用,
见下图:

在这里插入图片描述

  • Workspace:工作区(当前用户操作修改的区域)
  • Index / Stage:暂存区 (add后的区域)
  • Repository:仓库区或本地仓库(commit后的区域)
  • Remote:远程仓库(push后的区域)

整体过程可以简述为

  • 工作区–>add–>暂存区–>commit–>本地仓库区–>push–>远程仓库区
  • 远程仓库区–>fetch–>使用refs\remotes下对应分支文件记录远程分支末端commit_id 和 本地仓库区–>merge–>工作区
  • 远程仓库区–>pull–>使用refs\remotes下对应分支文件记录远程分支末端commit_id and 本地仓库区 and 工作区

假设项目存在这么一个提交记录:

$ git log
commit commit_id4 (HEAD -> master)
Author: test
Date:   Thu Aug 20 16:28:45 2020 +0800
    第三次修改README文件

commit commit_id3 (HEAD -> master)
Author: test
Date:   Thu Aug 20 16:28:45 2020 +0800
    第二次修改README文件

commit commit_id2
Author: test
Date:   Thu Aug 20 16:28:19 2020 +0800
    第一次修改README文件

commit commit_id1
Author: test
Date:   Thu Aug 20 16:26:59 2020 +080
    初始化项目

使用git reset即可完美解决回滚~
1、获取当前提交的commit id
命令:git log
获取到当前项目分支下的所有commit记录;
假设上述提交错误的commit id为commit id:commit_id4这一次提交;
他的上一次提交就是commit id:commit_id3 ,我们要将修改回滚到commit_id3的时刻!

如何将刚才 commit的修改保留下来呢?

2、将某个commit id前的commit清除,并保留修改的代码
命令:git reset <commit_id> 当前场景下就是:git reset commit_id3
将指定commit_id后的所有提交,都去除,并保留修改的代码在本地的区域,也就是Workspace

3、修改代码完成后,将修改好的代码add到暂存区,并提交到本地仓库中
命令:git add <file_name> and git commit 当前场景下:git add . and git commit
将最新修改后的代码commit
则提交后的提交记录假设如下: 可以看到,我们错误提交的commit_id4提交记录消失,取而代之的是我们更新代码后提交的记录commit_id5; 这样就完成了本地的代码修改和更新

$ git log
commit commit_id5 (HEAD -> master)
Author: test
Date:   Thu Aug 20 16:28:45 2020 +0800
    第三次修改README文件-更新错误后提交

commit commit_id3 (HEAD -> master)
Author: test
Date:   Thu Aug 20 16:28:45 2020 +0800
    第二次修改README文件

commit commit_id2
Author: test
Date:   Thu Aug 20 16:28:19 2020 +0800
    第一次修改README文件

commit commit_id1
Author: test
Date:   Thu Aug 20 16:26:59 2020 +080
    初始化项目

整体流程如下:

git log
git reset commit_id3
修改代码
git add .
git commit -m '第三次修改README文件-更新错误后提交'

git reset

如果我想要不保留回滚commit的修改,直接删除掉修改!该怎么处理呢?

首先整体看一下git reset的命令
还是先假设有这么一个提交链:
commit_id1 --> commit_id2 --> commit_id3 --> commit_id4

git reset commit_id2:
reset是将HEAD重新定位到commit_id2上,对于commit_id3 和 commit_id4 和本地当前的修改,对于不同的参数param,会有不同的处理;
reset命令的三种处理模式:

  • soft:保留commit修改,将修改存储到index中;也就是说git add后的区域(回退到目标版本,目标版本之后的改动将放到add后的index暂存区域,而本地当前的修改保留work tree中,即还未add的状态)
  • mixed:保留commit修改,将修改存储到本地工作区域中;也就是说git add前的区域(回退到目标版本,目标版本之后的改动以及本地的改动都将放到add前的保留work tree中)
  • hard:删除commit修改,慎用!(回退到目标版本,目标版本之后的改动以及本地的改动都删除)

git revert

如果想要只操作修改中间的一个commit,不对其他的commit产生影响; 也就是类似于我们只修改commit_id2,而对commit_id3 和 commit_id4无影响,该怎么处理呢?

适用场景: 在项目开发中,突然发现在前几次的提交中,有一次提交中包含一个bug; 当然我们可以进行一个新的修改,然后再提交一次; 但是,不优雅哈哈; 我们可以直接重做有bug的commit~

为什么不直接去再添加一个commit呢? git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的

比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西;
git revert -e commit_id
重做commit_id的提交信息,生成为一个新的new_commit_id

git revert -n commit_id
重做commit_id的提交,将commit_id中修改,放到index区,我们可以对他重新做修改并重新提交

revert 对比 reset:

  • git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留不动;
  • git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除或放回工作区等待下一次提交;

git checkout

如果我在一次开发中,发现某个文件修改错误了,想要将文件恢复到刚pull代码时的状态怎么办呢?

git checkout还有回滚指定文件的修改的功能:git checkout – <file_name>用过vscode的同学可能经常在左侧区域点放弃所有更改的图标
上述语句的作用,就是将file_name的本地工作区的修改全部撤销,有两种情况:

  • 如果file_name在commit后没有add过这个文件,则撤销到版本库中的状态
  • 如果file_name在commit后add过这个文件,则撤销到暂存区的状态,也就是add后的状态

总之,就是让指定的文件回滚到最近的一次git add 或者 git commit时的状态!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值