[Git修改提交]刚提交了代码,发现写错了怎么办
本节课学习如何修改已提交的commit。
在工作流中,我们在提交代码时的描述,是会有约定的,比如实现了一个功能,提交的描述就必须是“feature:描述”。比如修改了一个bug,提交的描述必须是“fixbug#bugId:描述”。比如做了一次合并,提交描述就必须是“merge:描述”。有些时候,我们的描述信息会写错,或者漏写。那么我们就需要修改之前的提交信息。
当然,代码改错了,或者某次提交忘记了带上某个源文件修改。这些情况,都需要重新修改之前的提交信息。
修改最后一次的commit
比如,我现在有一个开发分支dev
,上面已经有了4个commit
,如图所示:
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/dac3b3626eb940af89950ae4ed59fc32.webp)
修改提交信息
我发现提交信息不一致,我需要把最后一次commit
信息改成: 4
。 那么我们可以利用git commit --amend
这个命令来修改。
输入命令:
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/050b4d36560a4562a21ad5a0ca65a730.webp)
会弹出下面的信息,这就是最后一次commit
的描述信息,不过是vim
打开的,如果要编辑,按i(或者a,o都可以),进入编辑模式
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/f4d54de055cf4053a418dca4b933c85f.webp)
修改完成后,按ESC
,退出编辑模式,再按:wq
,回车保存退出。这样,最后一次commit
的描述信息就修改完成了。
使用git log
命令查看commit
信息。可以看到,最后一次提交的信息已经改成了4
。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/5c79a5e5dfb14bbfb6450b52784cc81b.webp)
最后推送代码,使用git push
,我们会发现推送报错。这是因为git push
默认只推送新的提交,我们现在是没有新提交的,只是修改了已有的提交。所以我们要使用git push --force
。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/0c54d3b530f84122bc38c7d923a7b9f8.webp)
我们再看下远程的提交情况,已经改过来了。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/2744462e8a374e65b8d37c841dbf1f62.webp)
当然,这里还有一个更加快速的方式,在调用amend
时,直接修改描述。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/869e3a8ef3e0489c82108fcc0980c870.webp)
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/e343451959954cfba1f128e775f28461.webp)
修改提交中的代码
如果要修改代码呢,比如现在我的readme文件内容是修改 4
。我需要把他改成修改 4.2
。把文件内容修改后,我们还是用git commit --amend
命令。如下图,我们可以看到,描述和文件都修改完成了。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/f00014e5fbf84e3dad891fe8885e7ef3.webp)
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/e7417800553542d39ca13dbf204fb5b2.webp)
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/6f5e10d0d3ab432e8c31b7731273683c.webp)
修改之前某次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个提交。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/0a6cb6019cf04a07a4f6340b7bc73e5a.webp)
弹出下面的信息。这里列出了HEAD~2
之后的两个提交,也就是 修改3 和 4.2 。 我们可以对这两个都进行修改。具体修改的命令下面列出来了。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/ed30aea31eca456e80dc5ef2956dcbd1.webp)
比如我们要修改 修改3 这个提交,那么我们就要把 修改3 前面的pick
改成edit
。这个也是vim
编辑,和前面一样,按i(或者a,o都可以),进入编辑模式,修改好后,在按ESC
退出编辑模式,再输入:wq
回车保存退出。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/f278c6a6f00547d7aa88a3bc8d30e2ad.webp)
保存好,会给出下一步的提示,我们继续使用git commit --amend
修改描述信息。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/1245d55b24f443fda0c3258d269a8df6.webp)
修改完成后,我们看看日志,会发现修改3
已经改成3
了,但是4.2
不见了。这是因为rebase
是逐个去重演提交的,现在只完成了一个提交(修改3
)的重演,4.2
的重演还没有开始。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/76e2a698eb654bfb9e687a56a61e0245.webp)
按照上面的提示,我们运行git rebase --continue。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/d2bd6c773dfd49138c5e9a884a88d97c.webp)
最后看下效果,提交信息都满足我们的要求了。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/0bd7e572903e4b128cead2c7e5f6d105.webp)
需要抛弃某个commit
现在我们发现提交 “2”属于无用提交,需要删掉。怎么操作。我们还是利用rebase
。前面的rebase
运行后,有一个drop
命令,这个就是移除commit
的。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/3bdfce26fe044841909e1224be7ac5fd.webp)
或者我们可以直接删除对应的提交。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/41ead81c73744aa59fb4c1c79034168f.webp)
保存后,会有可能出现代码合并的问题,因为rebase
是变基,会重新提交后面的每一次提交。所以如果前后代码有冲突,就会需要解决后再提交。和前面一样,需要继续运行git rebase --continue
,直到全部提交都完成。最后结果如图。
![[Git修改提交]刚提交了代码,发现写错了怎么办](https://static.blogweb.cn/article/f5f27ae560c34d99aec68a749f4ccf9e.webp)
如果分支已经push到远程
不建议再使用rebase
了, 因为已经push
到了远程,你不知道别人有没有同步到本地, 如果别人已经同步到了本地,你再去修改,就很容易出问题。
这种情况下,使用万能办法,提交一个新commit,把前面的错误都修改好,并在commit信息中说明详细情况。。。
总结
本课主要说到两个命令
git commit -amend
。这个是修改最后一次提交的命令。git rebase -i HEAD~x
。rebase
是变基操作,就是重新提交HEAD~x
后面的所有提交,通过这种办法来修改历史提交内。
转载自:https://juejin.cn/post/7205812357876006967