概述

在这个教程中,我们将学习如何修改Git(/git-guide)中的提交消息,无论是最近的一次还是较旧的提交。

1. 修改最近的提交消息

我们先从最简单的情况开始。让我们构建一个具有拼写错误的简单提交:

$ touch file1
$ git add file1
$ git commit -m "Ading file1"
[articles/BAEL-5627-how-to-modify-git-commit-message 3e9ac2dbcd] Ading file1
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1

现在确认最新的提交消息中存在错误,并记录下提交哈希:

$ git log -1
commit 3e9ac2dbcdde562e50c5064b288f5b3fa23f39da (HEAD -> articles/BAEL-5627-how-to-modify-git-commit-message)
Author: baeldung <[email protected]>
Date: Tue Jun 21 21:53:12 2022 +0200

 Ading file1

要修复拼写错误,我们将使用重写历史选项:

$ git commit --amend -m "Adding file1"
[articles/BAEL-5627-how-to-modify-git-commit-message 66dfa06796] Adding file1
Date: Tue Jun 21 21:53:12 2022 +0200
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1

再次显示最新的提交:

$ git log -1
commit 66dfa067969f941eef5304a6fbcd5b22d0ba6c2b (HEAD -> articles/BAEL-5627-how-to-modify-git-commit-message)
Author: baeldung <[email protected]>
Date: Tue Jun 21 21:53:12 2022 +0200

 Adding file1

现在我们可以确认错误已被修复在最新消息中,但请注意,提交哈希已经改变。实际上,我们并没有更改提交,而是用一个新的替换掉了它。

2. 重写较旧的提交消息

接下来,我们添加两个新提交,以便错误不在最新提交中,而是在较旧的提交中:

$ touch file2
$ git add file2
$ git commit -m "Ading file2"
[articles/BAEL-5627-how-to-modify-git-commit-message ffb7a68bf6] Ading file2
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file2
$ touch file3
$ git add file3
$ git commit -m "Adding file3"
[articles/BAEL-5627-how-to-modify-git-commit-message 517193e1e9] Adding file3
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 fil3

检查我们刚刚添加的两个提交:

$ git log -2
commit 517193e1e99c784efd48086f955fcdbc3110d097 (HEAD -> articles/BAEL-5627-how-to-modify-git-commit-message)
Author: baeldung <[email protected]>
Date: Tue Jun 21 22:04:56 2022 +0200

 Adding file3

commit ffb7a68bf63c7da9bd0b261ebb9b2ca548aa1333
Author: baeldung <[email protected]>
Date: Tue Jun 21 22:02:59 2022 +0200

 Ading file2

Git的amend选项只适用于最新提交,因此这次无法用来修正错误。

相反,我们将使用rebase

2.1. 开始交互式重置

要修复较旧的提交消息,我们将进行所谓的交互式重置,通过运行以下命令:

$ git rebase -i HEAD~2
hint: Waiting for your editor to close the file...

这里的HEAD~2表示我们将重新处理最近的两个提交。

这将打开与你的机器关联的Git文本编辑器(https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration),并填充编辑器,其中包含在重置过程中可以使用的所有命令,包括:

# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit

我们可以看到,在重置提交时,可以执行各种操作,比如通过squash命令将两个提交合并为一个。

这里,我们想要重写提交消息,所以我们将使用reword命令。

2.2. 重写提交消息

编辑器中的前两行包含以下文本:

pick ffb7a68bf6 Ading file2
pick 517193e1e9 Adding file3

注意,在这个视图中,提交按照从旧到新的顺序列出,与使用git loghttps://git-scm.com/docs/git-log)时的顺序相反。

让我们将第一条线上的pick命令改为reword命令,保留第二条线上的pick命令,因为我们想保留这条消息不变:

reword ffb7a68bf6 Ading file2
pick 517193e1e9 Adding file3

如果我们想在一个重置中同时更改两条消息,只需在两条行的命令上都改为reword即可。

现在,我们还没有更改提交消息。 所以让我们保存文件并关闭文本编辑器,让Git知道我们已完成重置指令。

Git现在将处理重置命令,并在需要时提示我们的交互。由于我们告诉Git重写第一条提交,它将重新打开文本编辑器,显示第一条提交的内容。第一条行包含提交消息:

Ading file2

下面几行的注释描述了reword操作的工作方式。

让我们编辑提交消息,将第一条行改为“Adding file2”,保存文件并关闭编辑器。

Git将更新我们的提交消息,然后完成剩余的重置指令。让我们确认Git的工作:

$ git log -2
commit 421d446d77d4824360b516e2f274a7c5299d6498 (HEAD -> articles/BAEL-5627-how-to-modify-git-commit-message)
Author: baeldung <[email protected]>
Date: Tue Jun 21 22:04:56 2022 +0200

 Adding file3

commit a6624ee55fdb9a6a2446fbe6c6fb8fe3bc4bd456
Author: baeldung <[email protected]>
Date: Tue Jun 21 22:02:59 2022 +0200

 Adding file2

同时,请注意这些提交的哈希已变,就像之前的修正提交一样。我们所有的原始提交已经被新的替换。

3. 推送重写过的提交

此时,我们的分支上有三个提交:一个修正过的和两个重写的。它们的提交哈希都与原始提交不同。

只要原始提交尚未推送到任何远程仓库,我们就可以正常地推送

然而,如果我们在替换它们之前已将任何有缺陷的提交推送到远程仓库,远程仓库将拒绝我们的新推送,因为我们的本地提交历史不再与仓库的历史兼容。

因此,如果我们要推送已修正(但之前已推送)的提交,我们将不得不使用强制选项

$ git push --force

此命令应谨慎使用,因为它会用我们的更改覆盖远程分支,如果该分支被其他人使用,可能会导致问题。

4. 结论

在这篇文章中,我们了解了如何编辑提交消息,无论它是最新的还是较旧的。我们也看到了如何将更改后的提交推送到包含原始提交的仓库,需要注意的是,这应该谨慎进行。