Help us learn about your current experience with the documentation. Take the survey.

教程:更新 Git 提交消息

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

偶尔,在你向分支提交了几次代码后,你可能需要更新一个或多个提交消息。也许你发现了拼写错误,或者某个自动化工具提醒你,你的提交消息没有完全符合项目的提交消息指南

如果你不经常使用命令行界面(CLI)来操作 Git,更新消息可能会有些棘手。但别担心,即使你只使用过 GitLab UI,也可以按照以下步骤使用 CLI。

本教程将介绍如何在两种情况下重写提交消息:

  • 如果你只在 GitLab UI 中工作,请从第 1 步开始。
  • 如果你已经将仓库克隆到本地,可以直接跳到第 2 步。

要重写任意数量的提交消息:

  1. 将项目仓库克隆到本地机器
  2. 获取并检出本地分支
  3. 更新提交消息
  4. 将更改推送到 GitLab

开始之前

你必须具备:

  • 一个包含需要更新提交的 Git 分支的 GitLab 项目。
  • 已在本地机器上安装 Git
  • 能够访问本地机器的命令行界面(CLI)。在 macOS 上,可以使用 Terminal。在 Windows 上,可以使用 PowerShell。Linux 用户可能已经熟悉系统的 CLI。
  • 熟悉系统默认编辑器。本教程假设你的编辑器是 Vim,但任何文本编辑器都可以使用。如果你不熟悉 Vim,Vim 入门的第 1 步到第 2 步解释了本教程后面使用的所有命令。
  • 覆盖提交消息的权限。如果你与多人在同一分支上工作,应先与他们确认是否可以更新提交。一些组织可能不允许重写提交,因为这被认为是一种破坏性更改。

你必须在最后一步通过 GitLab 进行身份验证才能覆盖提交消息。如果你的 GitLab 账户使用基本用户名和密码身份验证,你必须禁用双因素认证(2FA)才能从 CLI 进行身份验证。或者,你可以使用 SSH 密钥与 GitLab 进行身份验证

将仓库克隆到本地机器

第一步是在本地机器上获取仓库的克隆:

  1. 在 GitLab 中,在你的项目概览页面的右上角,选择 Code

  2. 在下拉列表中,通过选择 copy-to-clipboard 来复制仓库的 URL:

    • 如果你的 GitLab 账户使用基本用户名和密码身份验证,选择 Clone with HTTPS
    • 如果使用 SSH 与 GitLab 进行身份验证,选择 Clone with SSH
  3. 现在,切换到本地机器上的 CLI(Terminal、PowerShell 或类似工具),并导航到你想要克隆仓库的目录。例如,/users/my-username/my-projects/

  4. 运行 git clone 并粘贴你之前复制的 URL,例如:

    git clone https://gitlab.com/my-username/my-awesome-project.git

    这会将仓库克隆到一个名为 my-awesome-project/ 的新目录中。

现在你的仓库就在你的电脑上了,可以执行 Git CLI 命令了!

获取并检出你的分支

接下来,你需要检出包含要更新的提交的分支。

  1. 假设你仍在 CLI 的同一位置,使用 cd 更改到你的项目目录:

    cd my-awesome-project
  2. 可选。如果你刚刚克隆了仓库,你的分支应该也已经存在于你的电脑上。但如果你之前克隆了仓库并跳到了这一步,你可能需要使用以下命令获取你的分支:

    git fetch origin my-branch-name
  3. 现在你确定分支在本地系统上,切换到它:

    git checkout my-branch-name
  4. 使用 git log 验证这是正确的分支,并检查最近的提交是否与你在 GitLab 上的分支中的提交匹配。要退出日志,使用 q

更新提交消息

现在你准备好更新提交消息了:

  1. 在 GitLab 中,检查你需要回溯到提交历史中的多远:

    • 如果你已经为你的分支打开了合并请求,可以检查 Commits 选项卡并使用提交总数。
    • 如果你只从分支工作:
      1. 转到 Code > Commits
      2. 在左上角的下拉列表中找到你的分支。
      3. 找到你要更新的最旧的提交,并计算该提交回溯了多少。例如,如果你要更新第二个和第四个提交,计数将是 4。
  2. 从 CLI 开始交互式变基(rebase),这是 Git 更新提交的过程。将上一步的提交计数添加到 HEAD~ 的末尾,例如:

    git rebase -i HEAD~4

    在这个例子中,Git 选择分支中最近的四个提交进行更新。

  3. 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,在这种情况下
    # [等等...]
  4. pick 命令告诉 Git 不做更改地使用提交。你必须将你想要更新的提交的命令从 pick 改为 reword。输入 i 进入 INSERT 模式,然后开始编辑文本。

    例如,要更新上一个示例中第二个和第四个提交的文本,将其编辑为:

    pick a0cea50 修复损坏的链接
    reword bb84712 更新里程碑计划.md
    pick ce11fad 添加维护者列表
    reword d211d03 更新模板.md
  5. 保存编辑后的文本。按 Escape 退出 INSERT 模式,然后输入 :wq 并按 Enter 保存并退出。

  6. Git 现在逐个处理每个提交,并应用你选择的命令。任何带有 pick 的提交都会不加更改地添加回分支。当 Git 到达带有 reword 的提交时,它会停止并再次打开文本编辑器。现在终于可以更新提交消息的文本了!

    • 如果你只需要一行提交消息,根据需要更新文本。例如:

      更新月度里程碑计划
    • 如果提交消息需要标题和正文,用空行分隔它们。例如:

      更新月度里程碑计划
      
      通过列出每个维护者的职责,使里程碑计划更加清晰。

    保存并退出后,Git 更新提交消息,并按顺序处理下一个提交。完成后,你应该看到消息 Successfully rebased and update refs/heads/my-branch-name

  7. 可选。要验证提交消息是否已更新,你可以运行 git log 并向下滚动查看提交消息。

将更改推送到 GitLab

现在剩下的就是将这些更改推送到 GitLab:

  1. 从 CLI,将更改推回 GitLab。你必须使用 -f “强制推送” 选项,因为提交已被更新,强制推送会覆盖 GitLab 中的旧提交。

    git push -f origin

    在覆盖 GitLab 中的提交消息之前,你的终端可能会提示你输入用户名和密码。

  2. 在 GitLab 的你的项目中,验证提交是否已更新:

    • 如果你已经为你的分支打开了合并请求,检查 Commits 选项卡。
    • 如果你只从分支工作:
      1. 转到 Code > Commits
      2. 在左上角的下拉列表中找到你的分支。
      3. 验证列表中的相关提交现在已更新。

恭喜,你已成功更新提交消息并将它们推送到 GitLab!