在 IDEA 中写完了新增各种工具类的代码,完成了 Commit 和 Push,代码已经到了 GitHub远程仓库。
继续写着下一个功能的代码,突然,我发现刚才的Commit Message少写了一个已经完成的功能实现。
此时,我的工作区里已经有正在修改但暂时还不想提交的文件:
于是,我使用了 IDEA 的修正提交功能,补全了信息,重新点击了 Commit:
但是,当我再次点击 Push 时,出现了如下报错:
error: failed to push some refs to 'github.com:xxx/xxx.git'
! refs/heads/main:refs/heads/main [rejected] (non-fast-forward)
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart.
这个错误说人话就是:推送到远程被拒绝了!并且Git 提示你需要先 Pull。
原因分析
远程仓库保存着修改前的那次提交,我们把它记为 Commit A;
本地仓库在我使用修正功能时,Git 并没有直接修改 Commit A,而是把 Commit A 扔掉了,生成了一个全新的 Commit A’,这个新的commit有着新的 Hash 值,新的备注。
当我点击 Push 时,远程仓库发现现在推送的 Commit A’ 和已有的 Commit A 对不上,为了防止覆盖代码,Git 默认拦截了这次推送。
解决方案
本来我想使用 IDEA 的图形界面,但是,强制推送的按钮居然是灰色的,选不上。
所有,我使用命令行,在 IDEA 下方的 Terminal 中输入以下命令:
git push -f origin main
之后,就推送成功了。
小贴士
- 这样操作后,GitHub 上并不会多出一条记录,GitHub 上的记录会原地刷新。旧的提交(也就是少信息的那个)会被彻底删除,取而代之的是修改后的新提交。历史记录看起来非常干净,就像从来没有犯过错一样。
- 工作区里那个已修改但没勾选的文件不会受到任何影响,可以在下一次准备好时再提交。