修改提交信息
修改指定 commit 的提交信息(commit message)。
命令
bash
# 交互式选择 commit
gw amend
# 直接指定 commit hash
gw amend a1b2c3d
gw amend HEAD
gw amend HEAD~2使用方式
方式 1: 交互式选择(推荐)
不带参数运行,从最近 20 个 commit 中选择:
bash
gw amend方式 2: 指定 commit hash
直接指定要修改的 commit:
bash
# 使用短 hash
gw amend a1b2c3d
# 使用完整 hash
gw amend a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
# 使用相对引用
gw amend HEAD # 最新 commit
gw amend HEAD~1 # 上一个 commit
gw amend HEAD~2 # 上上个 commit交互流程
步骤 1: 选择 commit(如果未指定)
? 选择要修改的 commit:
❯ a1b2c3d ✨ feat(auth): 添加用户登录功能 2026-01-19 14:30:00
d4e5f6g 🐛 fix(auth): 修复登录bug 2026-01-18 10:20:00
h7i8j9k 📝 docs: 更新文档 2026-01-17 16:45:00
...步骤 2: 显示当前信息
当前 commit 信息:
Hash: a1b2c3d
Message: ✨ feat(auth): 添加用户登录功能
Date: 2026-01-19 14:30:00 +0800
────────────────────────────────────────步骤 3: 输入新的 commit message
? 输入新的 commit message: ✨ feat(auth): 实现用户登录和注册功能提示: 默认会显示原来的 message,可以直接编辑
步骤 4: 确认修改
修改预览:
Commit: a1b2c3d
旧 Message: ✨ feat(auth): 添加用户登录功能
新 Message: ✨ feat(auth): 实现用户登录和注册功能
────────────────────────────────────────
? 确认修改? (y/N)使用场景
场景 1: 修改最新 commit
bash
gw amend HEAD
# 或
gw amend
# 输入新的 message
# 确认
✔ 修改成功特点: 使用 git commit --amend,不会改变 commit hash
场景 2: 修改历史 commit
bash
gw amend HEAD~3
# 输入新的 message
# 确认
⚠️ 警告: 修改非最新 commit 需要使用 rebase,可能会改变 commit hash
这会影响已推送到远程的 commit,请谨慎操作
? 确认修改? (y/N) y
正在执行 rebase...
✔ 修改成功
⚠️ 注意: commit hash 已改变
如果已推送到远程,需要使用 force push:
git push --force-with-lease特点: 使用 git filter-branch,会改变 commit hash
场景 3: 修正拼写错误
bash
# 发现最新 commit 的 message 有拼写错误
gw amend HEAD
# 旧: feat: add logn feature
# 新: feat: add login feature
✔ 修改成功场景 4: 补充详细说明
bash
gw amend HEAD
# 旧: fix: bug
# 新: fix(auth): 修复登录页面在 Safari 浏览器下的兼容性问题
✔ 修改成功注意事项
⚠️ 修改历史 commit
- 会改变 commit hash - 所有后续 commit 的 hash 都会改变
- 影响团队协作 - 如果已推送到远程,其他人需要重新拉取
- 需要 force push - 推送时必须使用
--force-with-lease
🔒 Force Push
修改已推送的 commit 后,需要强制推送:
bash
# 推荐:更安全的 force push
git push --force-with-lease
# 或:强制推送(不推荐)
git push --force📝 Commit Message 规范
建议遵循 Conventional Commits 规范:
<type>(<scope>): <subject>
<body>
<footer>示例:
feat(auth): 添加用户登录功能
实现了基于 JWT 的用户认证系统,包括:
- 登录接口
- 注册接口
- Token 刷新机制
Closes #123示例
示例 1: 修改最新 commit 的 message
bash
$ gw amend HEAD
当前 commit 信息:
Hash: a1b2c3d
Message: feat: add feature
Date: 2026-01-19 14:30:00
? 输入新的 commit message: feat(auth): 添加用户登录功能
修改预览:
Commit: a1b2c3d
旧 Message: feat: add feature
新 Message: feat(auth): 添加用户登录功能
? 确认修改? y
✔ 修改成功示例 2: 修改指定 hash 的 commit
bash
$ gw amend d4e5f6g
当前 commit 信息:
Hash: d4e5f6g
Message: fix bug
Date: 2026-01-18 10:20:00
? 输入新的 commit message: fix(auth): 修复登录页面崩溃问题
⚠️ 警告: 修改非最新 commit 需要使用 rebase,可能会改变 commit hash
? 确认修改? y
正在执行 rebase...
✔ 修改成功
⚠️ 注意: commit hash 已改变
如果已推送到远程,需要使用 force push:
git push --force-with-lease示例 3: 交互式选择并修改
bash
$ gw amend
? 选择要修改的 commit:
❯ a1b2c3d feat: add feature 2026-01-19 14:30:00
d4e5f6g fix: bug 2026-01-18 10:20:00
? 输入新的 commit message: feat(auth): 添加用户登录和注册功能
? 确认修改? y
✔ 修改成功相关命令
gw c- 提交代码gw ad- 修改提交时间gw log- 查看提交日志git commit --amend- Git 原生修改命令
技术细节
实现方式
最新 commit:
bash
git commit --amend -m "新的 commit message"历史 commit:
bash
git filter-branch -f --msg-filter '
if [ "$GIT_COMMIT" = "commit-hash" ]; then
echo "新的 commit message"
else
cat
fi
' parent-hash..HEAD与 git commit --amend 的区别
| 特性 | gw amend | git commit --amend |
|---|---|---|
| 修改最新 commit | ✅ | ✅ |
| 修改历史 commit | ✅ | ❌ |
| 交互式选择 | ✅ | ❌ |
| 指定 hash | ✅ | ❌ |
| 预览修改 | ✅ | ❌ |
| 安全提示 | ✅ | ❌ |
常见问题
Q: 修改 commit message 会改变 commit hash 吗?
A:
- 最新 commit: 会改变 hash(因为 message 是 hash 计算的一部分)
- 历史 commit: 会改变该 commit 及所有后续 commit 的 hash
Q: 可以修改多行 commit message 吗?
A: 可以,直接在输入时换行即可。但建议使用简洁的单行 message,详细说明放在 body 部分。
Q: 修改后如何验证?
A: 使用 gw log 或 git log 查看提交历史,确认 message 已更新。
bash
gw log
# 或
git log --onelineQ: 修改失败怎么办?
A: 如果修改历史 commit 失败,可以使用 git reflog 找回之前的状态:
bash
git reflog
git reset --hard HEAD@{1}Q: 可以批量修改多个 commit 吗?
A: 当前版本不支持批量修改。如需批量修改,建议使用 git rebase -i 命令。
Q: 与 gw c 有什么区别?
A:
gw c- 创建新的 commitgw amend- 修改已有的 commit message
最佳实践
1. 修改前先检查状态
bash
# 查看当前分支和提交历史
gw log
# 确认要修改的 commit
git log --oneline -52. 遵循 commit message 规范
使用 Conventional Commits 格式:
feat: 新功能
fix: 修复 bug
docs: 文档更新
style: 代码格式
refactor: 重构
perf: 性能优化
test: 测试相关
chore: 其他杂项3. 修改后及时推送
bash
# 修改后立即推送,避免与他人冲突
git push --force-with-lease4. 团队协作时谨慎使用
如果 commit 已经被其他人拉取,修改会导致冲突。建议:
- 只修改本地未推送的 commit
- 或在团队内提前沟通