[Git修改提交]刚提交了代码,发现写错了怎么办

语言: CN / TW / HK

theme: devui-blue

本节课学习如何修改已提交的commit。

在工作流中,我们在提交代码时的描述,是会有约定的,比如实现了一个功能,提交的描述就必须是“feature:描述”。比如修改了一个bug,提交的描述必须是“fixbug#bugId:描述”。比如做了一次合并,提交描述就必须是“merge:描述”。有些时候,我们的描述信息会写错,或者漏写。那么我们就需要修改之前的提交信息。

当然,代码改错了,或者某次提交忘记了带上某个源文件修改。这些情况,都需要重新修改之前的提交信息。

修改最后一次的commit

比如,我现在有一个开发分支dev,上面已经有了4个commit,如图所示:

修改提交信息

我发现提交信息不一致,我需要把最后一次commit信息改成: 4。 那么我们可以利用git commit --amend这个命令来修改。 输入命令:

会弹出下面的信息,这就是最后一次commit的描述信息,不过是vim打开的,如果要编辑,按i(或者a,o都可以),进入编辑模式

修改完成后,按ESC,退出编辑模式,再按:wq,回车保存退出。这样,最后一次commit的描述信息就修改完成了。

使用git log命令查看commit信息。可以看到,最后一次提交的信息已经改成了4

最后推送代码,使用git push,我们会发现推送报错。这是因为git push默认只推送新的提交,我们现在是没有新提交的,只是修改了已有的提交。所以我们要使用git push --force

我们再看下远程的提交情况,已经改过来了。

当然,这里还有一个更加快速的方式,在调用amend时,直接修改描述。

修改提交中的代码

如果要修改代码呢,比如现在我的readme文件内容是修改 4。我需要把他改成修改 4.2。把文件内容修改后,我们还是用git commit --amend命令。如下图,我们可以看到,描述和文件都修改完成了。

修改之前某次commit

如果要修改之前的某次提交,我们就不能用amend了,amend只能修改当前分支最后一次修改。这次我们需要用到git rebase。Git 本身没有提供一个改变历史的工具,但是可以使用变基工具(rebase)来改变提交。

git rebase交互式变基给你一个它将会运行的脚本。 它将会从你在命令行中指定的提交开始,从上到下的依次重演每一个提交引入的修改。 它将最旧的而不是最新的列在上面,因为那会是第一个将要重演的。 比如我们指定 修改3 开始rebase,那么 修改3 和 4.2 都会被重新提交。 如果指定rebase到其他分支,比如master分支,那么 修改3 和 4.2 会被复制到master上。 rebase用多了容易导致代码混乱,不要滥用!!

比如,我们想把倒数第2次提交的修改3改成3。那么利用git rebase我们可以像下面这么写。这里的HEAD~2是指选择最新提交往前2个提交。

弹出下面的信息。这里列出了HEAD~2之后的两个提交,也就是 修改3 和 4.2 。 我们可以对这两个都进行修改。具体修改的命令下面列出来了。

比如我们要修改 修改3 这个提交,那么我们就要把 修改3 前面的pick改成edit。这个也是vim编辑,和前面一样,按i(或者a,o都可以),进入编辑模式,修改好后,在按ESC退出编辑模式,再输入:wq回车保存退出。

保存好,会给出下一步的提示,我们继续使用git commit --amend修改描述信息。

修改完成后,我们看看日志,会发现修改3已经改成3了,但是4.2不见了。这是因为rebase是逐个去重演提交的,现在只完成了一个提交(修改3)的重演,4.2的重演还没有开始。

按照上面的提示,我们运行git rebase --continue。

最后看下效果,提交信息都满足我们的要求了。

需要抛弃某个commit

现在我们发现提交 “2”属于无用提交,需要删掉。怎么操作。我们还是利用rebase。前面的rebase运行后,有一个drop命令,这个就是移除commit的。

或者我们可以直接删除对应的提交。

保存后,会有可能出现代码合并的问题,因为rebase是变基,会重新提交后面的每一次提交。所以如果前后代码有冲突,就会需要解决后再提交。和前面一样,需要继续运行git rebase --continue,直到全部提交都完成。最后结果如图。

如果分支已经push到远程

不建议再使用rebase了, 因为已经push到了远程,你不知道别人有没有同步到本地, 如果别人已经同步到了本地,你再去修改,就很容易出问题。 这种情况下,使用万能办法,提交一个新commit,把前面的错误都修改好,并在commit信息中说明详细情况。。。

总结

本课主要说到两个命令 - git commit -amend。这个是修改最后一次提交的命令。 - git rebase -i HEAD~xrebase是变基操作,就是重新提交HEAD~x后面的所有提交,通过这种办法来修改历史提交内。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情