Please enable Javascript to view the contents

Git的撤销更改

 ·   ·  ☕ 3 分钟  ·  ✍️ starifly · 👀... 阅读

前文《 Git基本操作》介绍了Git的基本概念和一些基本操作。

本文将介绍Git四个阶段的撤销更改:

  • 工作区的代码撤销
  • add到暂存区的代码想撤销
  • 提交到本地仓库的代码想撤销
  • 推送到远程仓库的代码想撤销

工作区代码的撤销

如果我们在工作区修改了文件,状态会变为Modified,这时忽然发现写错了想回到一开始未修改状态,愚蠢的办法是打开文件一个一个的去恢复,其实可以通过git checkout .命令来一键撤销工作区的代码修改,
当然也可以通过git checkout -- <filename>命令来指定撤销的文件。

add到暂存区的代码想撤销

如果add到了暂存区,你发现了错误想要撤销,可以执行以下两个步骤:

  1. git reset HEAD or git reset
  2. 同以上’工作区代码撤销'

git reset的参数,其值可以是hard、mixed及soft,mixed实现的是add后的回撤,上文中关于暂存未提交回撤中的git reset其实就是默认用的mixed参数,soft请听下文分解。

三者的区别:

模式 HEAD的位置 索引 工作树
soft 修改 不修改 不修改
mixed 修改 修改 不修改
hard 修改 修改 修改

提交到本地仓库的代码想撤销

如果执行了git commit命令把代码提交到了本地仓库,如果你后悔了,怎么办?不要着急,同样也可以撤销。

有以下两种情形:

回撤到指定版本号

可以利用git reset --hard <版本号>命令来实现版本回退,该命令中的版本号有几种不同的写法:

1.可以使用HEAD^来描述版本,一个^表示前一个版本,两个^^表示前两个版本,以此类推。
2.也可以使用数字来代替^,比如说前100个版本可以写作HEAD~100。
3.也可以直接写版本号,表示跳转到某一个版本处(通过git log查看当前提交日志)。

回撤到add之后未commit之前的状态

soft实现的是commit之后回撤到add之后未commit之前的状态,所以,像在commit之后发现少提交了一个文件等场景下,我们可以利用git reset --soft HEAD^命令来回撤。

push到远程仓库的代码想撤销

有时,在git push之后,才发现还有一些代码需要进行很小的改动,这些改动在原则上不应该作为一次新的提交。
这时,我们需要撤销这次推送(git push)与提交(git commit),然后进行代码修改,再重新进行提交和推送。

为了实现这个目的,需要进行三步操作:

1.撤销提交信息

通过执行git reset --soft <版本号>重置至指定版本的提交,达到撤销提交的目的。

参数soft指的是:保留当前工作区,以便重新提交。
还可以选择参数hard,会撤销相应工作区的修改,而且有可能意外造成代码丢失,所以一定要谨慎使用。

然后,通过git log确认是否成功撤销。

2.撤销

通过git push origin master --force强制提交当前版本号,以达到撤销版本号的目的。

当他人在仓库的远程副本的同一分支上进行改动后,会发生强制推送的风险。当你强制推送已重写的历史记录时,某些提交将会丢失。这是git push --force-with-lease出现的原因 - 如果远程分支已更新,它不会允许你执行强制推送,这将确保你不会丢弃他人的工作。

必须添加参数force进行强制提交,否则会提交失败,并报错。
报错原因:本地项目版本号低于远端仓库版本号。

3.修改代码,重新提交和推送

//修改代码,添加修改
$ git add .
//重新提交
$ git commit -m "message"
//重新推送
$ git push origin master

Reference

-------他日江湖相逢 再当杯酒言欢-------
分享

飞鸟
作者: starifly ❉
天无边,智无限。


目录

点击屏幕右上角的 ···
在弹出的窗口中选择 在浏览器中打开