前言

在使用 Git 提交代码时,我们有时会因为手速过快、疏忽大意或使用 AI 辅助工具时未及时调整,导致提交(Commit)信息不符合规范或包含错误格式。

例如:AI 生成的 Commit 信息带有 Markdown 代码块的格式,如下所示,明显是不合适的:

```
feat(settings): 重构情绪权重组件并优化交互逻辑
将 EmotionSlider 和 EmotionRadar 组件重构为独立模块,调整其目录结构并增强功能。
... (省略部分内容)
```

为了修复这种情况,我们需要修改已经提交的 Commit 信息。根据要修改提交的数量,Git 提供了不同的解决方案。

教程:如何修改 Commit 信息

场景一:只修改最近的一次提交(最常见)

如果你只需要修改最近的一次提交(即 HEAD),最简单、最推荐的方法是使用 git commit --amend

1. 运行修改命令

执行以下命令:

git commit --amend

该命令会打开你的默认编辑器,其中已经加载了上一次提交的信息。

2. 修改并保存

在编辑器中修改 Commit 信息后,保存并退出(如 Vim 中使用 :wq,Nano 中使用 CTRL+OCTRL+X)。

Git 会用你修改后的新信息替换掉上一次的 Commit 信息,其 SHA-1 值也会随之改变。

场景二:修改历史中任意多个提交(使用 Rebase)

如果你需要修改最近的多次提交,或者历史中更早的提交信息,就需要使用 Git 的交互式变基(Interactive Rebase)功能。

以你提到的“修改最近 2 次提交”为例:

1. 启动交互式变基

运行以下命令,指定要修改的提交范围:

git rebase -i HEAD~2

HEAD~2 的含义:

  • HEAD~2 指定了本次变基的基点(Base Commit)
  • Git 会列出从这个基点之后到当前 HEAD 的所有提交供你修改。
  • 因此,运行 HEAD~2 会列出最近的两个提交。

此时会打开默认编辑器(编辑器类型取决于你的 Git 配置,通常是 Vim 或 Nano),你会看到类似以下内容的列表:

pick abc1234 第一次提交信息
pick def5678 第二次提交信息

# Rebase 4918e9a..def5678 onto 4918e9a (2 commands)
# ... (下方是说明和指令列表)

2. 标记要修改的提交

将列表中要修改的提交前的 pick 关键字改为 reword(或使用缩写 r):

reword abc1234 第一次提交信息
reword def5678 第二次提交信息
reword 的作用:
保留提交(Commit)的内容和日期不变,但允许你修改提交信息(Message)。

3. 保存 Rebase 待办列表

修改完成后,保存并关闭当前编辑器。

  • Vim 编辑器:

    • ESC 退出插入模式。
    • 输入 :wq(冒号 + wq)然后回车,保存并退出。
  • Nano 编辑器:

    • CTRL+O 然后回车保存。
    • CTRL+X 退出。

4. 逐个修改 Commit 信息

接下来,Git 会依次打开编辑器,让你修改每个被标记为 reword 的提交信息。

  1. 第一次打开: 对应列表中的第一个 reword 提交 (abc1234)。

    • 删除原有内容,输入新的、完整的 Commit 信息(建议遵循团队规范)。
    • 保存并退出。
  2. 第二次打开: 对应列表中的第二个 reword 提交 (def5678)。

    • 重复同样的修改、保存、退出操作。

当所有 reword 标记的提交都修改完成后,rebase 操作即宣告成功。

5. 验证修改结果

你可以运行以下命令查看最新的提交记录是否已被更新:

# 查看最近两个提交的简略信息
git log --oneline -2

# 查看最近两个提交的完整信息
git log -2

确认提交信息已更新为你修改后的内容。

后续处理:远程推送

如果这些被修改的提交之前已经使用 git push 推送到远程仓库,那么本地的历史记录与远程仓库已经不一致了(因为你改变了提交的 SHA-1 值)。

在这种情况下,你需要使用强制推送来覆盖远程仓库的历史记录。

🚨 强制推送(Push Force)

# 推荐使用,更安全的强制推送
git push --force-with-lease

推荐 --force-with-lease 的原因:

  • 它比 --force 更安全。它会检查远程分支在你本地上次拉取(fetch)之后是否被其他人修改过。
  • 如果远程分支有新的提交,--force-with-lease 会失败,从而避免你意外覆盖他人提交
  • 只有在你确定自己是唯一修改者,或团队已明确历史记录需要重写时,才执行此操作。

补充与注意事项

  1. 关于编辑器:
    Git 默认使用的编辑器由 core.editor 配置决定。如果你不确定或想更换编辑器,可以使用以下命令查看或配置:

    # 查看当前配置的编辑器
    git config --global core.editor
    
    # 例如,配置 Nano 为编辑器
    git config --global core.editor "nano"
  2. 变基出错回退:
    如果在 rebase -i 过程中,你不小心操作失误或想取消所有修改,可以使用以下命令回退到变基操作前的状态:

    git rebase --abort
  3. 遵循规范:
    确保修改后的提交信息符合团队的 Commit 规范(如:Conventional Commits)。清晰、规范的 Commit 信息对代码审查和项目维护至关重要。
分类: Git 笔记 标签: gitcommitrebase

评论

暂无评论数据

暂无评论数据

目录