教程:更新 Git 提交消息
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
偶尔,在你向分支提交了几次代码后,你可能需要更新一个或多个提交消息。也许你发现了拼写错误,或者某个自动化工具提醒你,你的提交消息没有完全符合项目的提交消息指南。
如果你不经常使用命令行界面(CLI)来操作 Git,更新消息可能会有些棘手。但别担心,即使你只使用过 GitLab UI,也可以按照以下步骤使用 CLI。
本教程将介绍如何在两种情况下重写提交消息:
- 如果你只在 GitLab UI 中工作,请从第 1 步开始。
- 如果你已经将仓库克隆到本地,可以直接跳到第 2 步。
要重写任意数量的提交消息:
开始之前
你必须具备:
- 一个包含需要更新提交的 Git 分支的 GitLab 项目。
- 已在本地机器上安装 Git。
- 能够访问本地机器的命令行界面(CLI)。在 macOS 上,可以使用 Terminal。在 Windows 上,可以使用 PowerShell。Linux 用户可能已经熟悉系统的 CLI。
- 熟悉系统默认编辑器。本教程假设你的编辑器是 Vim,但任何文本编辑器都可以使用。如果你不熟悉 Vim,Vim 入门的第 1 步到第 2 步解释了本教程后面使用的所有命令。
- 覆盖提交消息的权限。如果你与多人在同一分支上工作,应先与他们确认是否可以更新提交。一些组织可能不允许重写提交,因为这被认为是一种破坏性更改。
你必须在最后一步通过 GitLab 进行身份验证才能覆盖提交消息。如果你的 GitLab 账户使用基本用户名和密码身份验证,你必须禁用双因素认证(2FA)才能从 CLI 进行身份验证。或者,你可以使用 SSH 密钥与 GitLab 进行身份验证。
将仓库克隆到本地机器
第一步是在本地机器上获取仓库的克隆:
-
在 GitLab 中,在你的项目概览页面的右上角,选择 Code。
-
在下拉列表中,通过选择 来复制仓库的 URL:
- 如果你的 GitLab 账户使用基本用户名和密码身份验证,选择 Clone with HTTPS。
- 如果使用 SSH 与 GitLab 进行身份验证,选择 Clone with SSH。
-
现在,切换到本地机器上的 CLI(Terminal、PowerShell 或类似工具),并导航到你想要克隆仓库的目录。例如,
/users/my-username/my-projects/。 -
运行
git clone并粘贴你之前复制的 URL,例如:git clone https://gitlab.com/my-username/my-awesome-project.git这会将仓库克隆到一个名为
my-awesome-project/的新目录中。
现在你的仓库就在你的电脑上了,可以执行 Git CLI 命令了!
获取并检出你的分支
接下来,你需要检出包含要更新的提交的分支。
-
假设你仍在 CLI 的同一位置,使用
cd更改到你的项目目录:cd my-awesome-project -
可选。如果你刚刚克隆了仓库,你的分支应该也已经存在于你的电脑上。但如果你之前克隆了仓库并跳到了这一步,你可能需要使用以下命令获取你的分支:
git fetch origin my-branch-name -
现在你确定分支在本地系统上,切换到它:
git checkout my-branch-name -
使用
git log验证这是正确的分支,并检查最近的提交是否与你在 GitLab 上的分支中的提交匹配。要退出日志,使用q。
更新提交消息
现在你准备好更新提交消息了:
-
在 GitLab 中,检查你需要回溯到提交历史中的多远:
- 如果你已经为你的分支打开了合并请求,可以检查 Commits 选项卡并使用提交总数。
- 如果你只从分支工作:
- 转到 Code > Commits。
- 在左上角的下拉列表中找到你的分支。
- 找到你要更新的最旧的提交,并计算该提交回溯了多少。例如,如果你要更新第二个和第四个提交,计数将是 4。
-
从 CLI 开始交互式变基(rebase),这是 Git 更新提交的过程。将上一步的提交计数添加到
HEAD~的末尾,例如:git rebase -i HEAD~4在这个例子中,Git 选择分支中最近的四个提交进行更新。
-
Git 启动文本编辑器并列出选定的提交。例如,它应该看起来类似于:
pick a0cea50 修复损坏的链接 pick bb84712 更新里程碑计划.md pick ce11fad 添加维护者列表 pick d211d03 更新模板.md # 变基 1f5ec88..d211d03 到 1f5ec88 (4 个命令) # # 命令: # p, pick <commit> = 使用提交 # r, reword <commit> = 使用提交,但编辑提交消息 # e, edit <commit> = 使用提交,但停止以进行修改 # s, squash <commit> = 使用提交,但合并到前一个提交 # f, fixup [-C | -c] <commit> = 类似 "squash",但只保留前一个 # 提交的日志消息,除非使用 -C,在这种情况下 # [等等...] -
pick命令告诉 Git 不做更改地使用提交。你必须将你想要更新的提交的命令从pick改为reword。输入i进入INSERT模式,然后开始编辑文本。例如,要更新上一个示例中第二个和第四个提交的文本,将其编辑为:
pick a0cea50 修复损坏的链接 reword bb84712 更新里程碑计划.md pick ce11fad 添加维护者列表 reword d211d03 更新模板.md -
保存编辑后的文本。按 Escape 退出
INSERT模式,然后输入:wq并按 Enter 保存并退出。 -
Git 现在逐个处理每个提交,并应用你选择的命令。任何带有
pick的提交都会不加更改地添加回分支。当 Git 到达带有reword的提交时,它会停止并再次打开文本编辑器。现在终于可以更新提交消息的文本了!-
如果你只需要一行提交消息,根据需要更新文本。例如:
更新月度里程碑计划 -
如果提交消息需要标题和正文,用空行分隔它们。例如:
更新月度里程碑计划 通过列出每个维护者的职责,使里程碑计划更加清晰。
保存并退出后,Git 更新提交消息,并按顺序处理下一个提交。完成后,你应该看到消息
Successfully rebased and update refs/heads/my-branch-name。 -
-
可选。要验证提交消息是否已更新,你可以运行
git log并向下滚动查看提交消息。
将更改推送到 GitLab
现在剩下的就是将这些更改推送到 GitLab:
-
从 CLI,将更改推回 GitLab。你必须使用
-f“强制推送” 选项,因为提交已被更新,强制推送会覆盖 GitLab 中的旧提交。git push -f origin在覆盖 GitLab 中的提交消息之前,你的终端可能会提示你输入用户名和密码。
-
在 GitLab 的你的项目中,验证提交是否已更新:
- 如果你已经为你的分支打开了合并请求,检查 Commits 选项卡。
- 如果你只从分支工作:
- 转到 Code > Commits。
- 在左上角的下拉列表中找到你的分支。
- 验证列表中的相关提交现在已更新。
恭喜,你已成功更新提交消息并将它们推送到 GitLab!