错误是常见的,我们都会犯错。这就是为什么铅笔上会有橡皮擦。对于像Git这样的工具来说,这一点也不例外。虽然有些改动很难撤销,但通常还是有办法的。
那么,如果你想修改现有的提交信息呢?幸运的是,这在Git中很简单,但方法可能会因一些因素而有些变化。
修复最后一次提交,尚未推送到远程的内容
这是最简单的情况,因为不需要修改远程仓库,只需要修改自己的仓库。在这种情况下,你可以使用下面的命令:
$ git commit --amend
运行这个命令会打开一个编辑器,你可以在里面修改最后的提交信息。一旦你完成并保存/关闭编辑器,提交信息就会被修改。
就我个人而言,我更喜欢在命令行上做大多数事情,你可以通过在上面的命令中添加参数和信息来实现:
$ git commit --amend -m "Added a new file"
这样做不会打开编辑器,而只是立即修改提交信息。
修复最后一次提交,推送到远程
这是另一种常见的情况,修复起来比较困难,不仅因为我们需要修改自己的仓库,还需要修改远程仓库,它可能比你的本地分支更靠前。
第一步是修改最后的提交,就像我们在上一节做的那样:
$ git commit --amend -m "Added a new file"
然后,你需要把这些修改推送到远程仓库。不过,这必须使用--force 标志来完成:
$ git push <remote> <branch> --force
我们需要这样做,以便用我们自己的本地状态覆盖远程版本库。
要注意的是,通过强制推送,你也会失去本地分支上任何尚未在本地分支上的提交。谨慎行事!
如果你能足够快地抓住这个错误,那么进行修改就不会有问题。否则,你可能需要找到另一个解决方案,以避免丢失你想修改的提交信息之后的任何修改。
使用交互式重做
另一个比前面描述的解决方案更灵活的选择是使用交互式重写。这样做可以让你检查最近的N个提交,并对它们进行修改,包括挑选、压制等。
要启动 rebase,你可以使用以下命令:
$ git rebase -i HEAD~n
这里,n 是你想检查和编辑的提交的数量。然后你会看到一个提交的列表,类似于这样:
$ $ git rebase -i HEAD~4
pick 788ebf0 Oops, I forgot to add a new file
pick ced1329 Fixed a super critical bug
pick 5e9cdc5 Added a new file
# Rebase d05209d..5e9cdc5 onto d05209d (4 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
如你所见,所有最近的N个提交都被列出,你可以根据需要修改它们的信息。