前文《 Git基本操作》介绍了Git的基本概念和一些基本操作。
本文将介绍Git四个阶段的撤销更改:
- 工作区的代码撤销
- add到暂存区的代码想撤销
- 提交到本地仓库的代码想撤销
- 推送到远程仓库的代码想撤销
工作区代码的撤销
如果我们在工作区修改了文件,状态会变为Modified,这时忽然发现写错了想回到一开始未修改状态,愚蠢的办法是打开文件一个一个的去恢复,其实可以通过git checkout .
命令来一键撤销工作区的代码修改,
当然也可以通过git checkout -- <filename>
命令来指定撤销的文件。
add到暂存区的代码想撤销
如果add
到了暂存区,你发现了错误想要撤销,可以执行以下两个步骤:
git reset HEAD
orgit reset
- 同以上’工作区代码撤销'
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