对话面试官---如何回退错误提交?

557 阅读3分钟

这是我参与更文挑战的第19天,活动详情查看: 更文挑战


问题描述 在利用 github 实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让代码回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)。

方法一:git reset

原理:git reset 命令用于回退版本,可以指定退回某一次提交的版本。

具体操作:

git reset 命令语法格式如下:

git reset [--soft | --mixed | --hard] [HEAD]

--mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。

--soft 参数用于回退到某个版本,这种一般用于 git add后的回退

git reset --soft HEAD

--hard 参数用于回退到某个版本,这种一般用于 git commit后但还未push到远端的回退

这种回退方式不会保留本地修改所有代码,使用时一定要小心

git reset --hard HEAD

还有一种我常用的方式

git reset 【--hard】 origin/master

这种命令会把本地代码直接回退成主分支最新代码

方法二:git revert

原理: git revert 是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们 commit 了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有 bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:

适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

具体操作: 举个例子,现在库里面有三个文件:READ.md、text.txt、text2.txt。

  1. 查看版本号: 可以通过命令行查看(输入 git log): 如图,最近的两个版本分别叫:“add text.txt”(即新增了文件 text.txt)、“add text2.txt”(新增了文件 text2.txt)。这个时候我们不需要 text.txt 这个文件了,那就是说不想要“add text.txt”那个版本的操作,那可以通过反做“add text.txt”这个版本来实现。

也可以通过 github 网站图形化界面查看版本号:

2.使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交: (1)反做,使用“git revert -n 版本号”命令。如下命令,我们反做版本号为 8b89621 的版本:

git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb9861 1 注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要 git add 文件名。 (2)提交,使用“git commit -m 版本名”,如:

git commit -m "revert add text.txt" 1 此时可以用“git log”查看本地的版本信息,可见多生成了一个新的版本,该版本反做了“add text.txt”版本,但是保留了“add text2.txt”版本:

3.使用“git push”推上远程库:

git push 1 查看 github 上显示的远程库版本信息:

此时查看仓库的文件,剩下两个:READ.md、text2.txt