Git 删除远程仓库的某次错误提交

/ 0评 / 3

1、删除最后一次提交

假设你有3个commit如下:

commit 3
commit 2
commit 1

其中最后一次提交commit 3是错误的,那么可以执行:

git reset --hard HEAD~1

你会发现,HEAD is now at commit 2。

然后再使用git push --force将本次变更强行推送至服务器。这样在服务器上的最后一次错误提交也彻底消失了。

值得注意的是,这类操作比较比较危险,例如:在你的commit 3之后别人又提交了新的commit 4,那在你强制推送之后,那位仁兄的commit 4也跟着一起消失了。

这个跟上面一样的~
这种情况是最简单的了,只需要以下两步就可以了

git revert HEAD
git push origin master

注意,revert和reset的区别:
revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在,而reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。

我们使用revert放弃最后一次提交,之后执行git log:

git revert HEAD
git log

历史记录中还有第三次提交的记录,并且多了一次的提交,但是仓库内容已经回到了第二次提交之后的状态。 现在我们使用reset回到第三次提交,之后执行git log:

git reset --hard HEAD^
git log

历史记录中已经没有之前revert生成的提交记录了。 如果删除远程仓库的最后一次提交的时候不需要保留历史记录的话,可以使用reset,命令如下:

git reset --hard HEAD^
git push origin master -f

-f 参数是强制提交,因为reset之后本地库落后于远程库一个版本,因此需要强制提交。

2、删除历史某次提交

这种情况需要先用git log命令在历史记录中查找到想要删除的某次提交的commit id,比如上面所说的注释为"2"的提交的commit id(由此可见提交的注释很重要,一定要认真写)

然后执行以下命令("commit id"替换为想要删除的提交的"commit id",需要注意最后的^号,意思是commit id的前一次提交):

git rebase -i "commit id"^

执行该条命令之后会打开一个编辑框,列出了包含该次提交在内之后的所有提交。
然后在编辑框中删除你想要删除的提交所在行,然后保存退出就好啦,如果有冲突的需要解决冲突。接下来,执行以下命令,将本地仓库提交到远程库就完成了:

git push origin master -f

3、修改历史某次提交

这种情况的解决方法类似于第二种情况,只需要在第二条打开编辑框之后,将你想要修改的提交所在行的pick替换成edit然后保存退出,这个时候rebase会停在你要修改的提交,然后做你需要的修改,修改完毕之后,执行以下命令:

git add .
git commit --amend
git rebase --continue

如果你在之前的编辑框修改了n行,也就是说要对n次提交做修改,则需要重复执行以上步骤n次。
需要注意的是,在执行rebase命令对指定提交修改或删除之后,该次提交之后的所有提交的"commit id"都会改变。

评论已关闭。