修改提交时间
修改指定 commit 的提交时间(Author Date 和 Committer Date)。
命令
# 交互式选择 commit
gw amend:date
gw ad
# 直接指定 commit hash
gw ad a1b2c3d
gw ad HEAD~2使用方式
方式 1: 交互式选择(推荐)
不带参数运行,从最近 20 个 commit 中选择:
gw ad方式 2: 指定 commit hash
直接指定要修改的 commit:
# 使用短 hash
gw ad a1b2c3d
# 使用完整 hash
gw ad a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
# 使用相对引用
gw ad HEAD # 最新 commit
gw ad HEAD~1 # 上一个 commit
gw ad HEAD~2 # 上上个 commit交互流程
步骤 1: 选择 commit(如果未指定)
? 选择要修改时间的 commit:
❯ a1b2c3d ✨ feat(auth): 添加用户登录功能 2026-01-19 14:30:00 +0800
d4e5f6g 🐛 fix(auth): 修复登录bug 2026-01-18 10:20:00 +0800
h7i8j9k 📝 docs: 更新文档 2026-01-17 16:45:00 +0800
...步骤 2: 显示当前信息
当前 commit 信息:
Hash: a1b2c3d
Message: ✨ feat(auth): 添加用户登录功能
Date: 2026-01-19 14:30:00 +0800
────────────────────────────────────────步骤 3: 输入新日期
支持格式:
YYYY-MM-DD (如: 2026-01-19,默认 00:00:00)
YYYY-MM-DD HH:mm:ss (如: 2026-01-19 14:30:00)
? 输入新的日期: 2026-01-15 14:30:00支持的日期格式:
YYYY-MM-DD- 只指定日期,时间默认为00:00:00YYYY-MM-DD HH:mm:ss- 指定完整的日期和时间
步骤 4: 确认修改
修改预览:
Commit: a1b2c3d
旧时间: 2026-01-19 14:30:00 +0800
新时间: 2026-01-15 14:30:00
修改类型: Author + Committer (两者都修改)
────────────────────────────────────────
? 确认修改? (y/N)使用场景
场景 1: 修改最新 commit
gw ad HEAD
# 或
gw ad
# 输入日期: 2026-01-15
# 确认
✔ 修改成功特点: 使用 git commit --amend,不会改变 commit hash
场景 2: 修改历史 commit
gw ad HEAD~3
# 输入日期: 2026-01-10
# 确认
⚠️ 警告: 修改非最新 commit 需要使用 rebase,可能会改变 commit hash
这会影响已推送到远程的 commit,请谨慎操作
? 确认修改? (y/N) y
正在执行 rebase...
✔ 修改成功
⚠️ 注意: commit hash 已改变
如果已推送到远程,需要使用 force push:
git push --force-with-lease特点: 使用 git filter-branch,会改变 commit hash
场景 3: 批量修改多个 commit
# 修改第一个
gw ad HEAD~2
# 输入: 2026-01-10
# 修改第二个
gw ad HEAD~1
# 输入: 2026-01-11
# 修改最新的
gw ad HEAD
# 输入: 2026-01-12注意事项
⚠️ 修改历史 commit
- 会改变 commit hash - 所有后续 commit 的 hash 都会改变
- 影响团队协作 - 如果已推送到远程,其他人需要重新拉取
- 需要 force push - 推送时必须使用
--force-with-lease
� Fo前rce Push
修改已推送的 commit 后,需要强制推送:
# 推荐:更安全的 force push
git push --force-with-lease
# 或:强制推送(不推荐)
git push --force📅 时间格式
支持两种输入格式:
仅日期:
YYYY-MM-DD(如2026-01-19)- 时间默认为
00:00:00 - 适合只关心日期的场景
- 时间默认为
完整时间:
YYYY-MM-DD HH:mm:ss(如2026-01-19 14:30:00)- 可以精确指定时分秒
- 适合需要精确时间的场景
示例:
# 只指定日期
输入: 2026-01-19
结果: 2026-01-19 00:00:00
# 指定完整时间
输入: 2026-01-19 14:30:00
结果: 2026-01-19 14:30:00
# 指定午夜
输入: 2026-01-19 00:00:00
结果: 2026-01-19 00:00:00
# 指定一天结束
输入: 2026-01-19 23:59:59
结果: 2026-01-19 23:59:59时区: 使用系统当前时区
🔄 修改范围
默认同时修改:
- Author Date: 代码编写时间
- Committer Date: 代码提交时间
示例
示例 1: 修改最新 commit 为指定日期
$ gw ad HEAD
输入新的日期: 2026-01-15
确认修改? y
✔ 修改成功示例 2: 修改为指定的完整时间
$ gw ad HEAD
输入新的日期: 2026-01-15 14:30:00
确认修改? y
✔ 修改成功示例 3: 修改指定 hash 的 commit
$ gw ad a1b2c3d
输入新的日期: 2026-01-10 09:00:00
确认修改? y
⚠️ 警告: 修改非最新 commit 需要使用 rebase,可能会改变 commit hash
正在执行 rebase...
✔ 修改成功示例 4: 交互式选择并修改
$ gw ad
? 选择要修改时间的 commit:
❯ a1b2c3d ✨ feat: 添加登录功能 2026-01-19 14:30:00
d4e5f6g 🐛 fix: 修复bug 2026-01-18 10:20:00
输入新的日期: 2026-01-15 16:45:30
确认修改? y
✔ 修改成功相关命令
gw c- 提交代码gw log- 查看提交日志git log --format="%ai"- 查看 Author Dategit log --format="%ci"- 查看 Committer Date
技术细节
Author Date vs Committer Date
Git 中每个 commit 都有两个时间戳:
📝 Author Date (作者时间)
- 含义: 代码实际编写的时间
- 设置时机: 第一次创建 commit 时
- 保持不变: 即使 rebase、cherry-pick 也会保留原始作者时间
- 查看命令:
git log --format="%ai"
示例场景:
# 2026-01-15 你写了代码并提交
git commit -m "feat: 添加登录功能"
# Author Date: 2026-01-15 10:00:00
# 2026-01-20 你 rebase 了这个 commit
git rebase -i HEAD~5
# Author Date: 仍然是 2026-01-15 10:00:00 (不变)
# Committer Date: 2026-01-20 14:30:00 (更新为 rebase 时间)📦 Committer Date (提交时间)
- 含义: 代码最后一次被提交到仓库的时间
- 设置时机: 每次 commit、amend、rebase、cherry-pick 时
- 会更新: 任何修改 commit 的操作都会更新这个时间
- 查看命令:
git log --format="%ci"
示例场景:
# 原始提交
git commit -m "feat: 添加登录功能"
# Author Date: 2026-01-15 10:00:00
# Committer Date: 2026-01-15 10:00:00
# 修改 commit message
git commit --amend -m "feat(auth): 添加用户登录功能"
# Author Date: 2026-01-15 10:00:00 (不变)
# Committer Date: 2026-01-15 10:30:00 (更新)
# 再次修改
git commit --amend --no-edit
# Author Date: 2026-01-15 10:00:00 (不变)
# Committer Date: 2026-01-15 11:00:00 (再次更新)🔄 两者的关系
| 操作 | Author Date | Committer Date |
|---|---|---|
git commit | 设置为当前时间 | 设置为当前时间 |
git commit --amend | 保持不变 | 更新为当前时间 |
git rebase | 保持不变 | 更新为当前时间 |
git cherry-pick | 保持原 commit 时间 | 设置为当前时间 |
git merge | 保持原 commit 时间 | 保持原 commit 时间 |
🎯 为什么要同时修改两者?
在大多数情况下,我们希望这两个时间保持一致,因为:
- 简化理解: 避免混淆,一个 commit 只有一个时间
- 历史清晰: 提交历史更容易理解和追溯
- 避免误导: 防止出现"作者时间是昨天,但提交时间是今天"的困惑
本命令默认同时修改两者,确保时间一致性。
📊 查看两个时间
# 查看 Author Date
git log --format="%ai %s"
# 输出: 2026-01-15 10:00:00 +0800 feat: 添加登录功能
# 查看 Committer Date
git log --format="%ci %s"
# 输出: 2026-01-15 10:00:00 +0800 feat: 添加登录功能
# 同时查看两者
git log --format="Author: %ai | Committer: %ci | %s"
# 输出: Author: 2026-01-15 10:00:00 +0800 | Committer: 2026-01-15 10:00:00 +0800 | feat: 添加登录功能
# 使用 gw log 查看(更友好)
gw log实现方式
最新 commit:
GIT_AUTHOR_DATE="2026-01-15 00:00:00" \
GIT_COMMITTER_DATE="2026-01-15 00:00:00" \
git commit --amend --no-edit历史 commit:
git filter-branch -f --env-filter '
if [ "$GIT_COMMIT" = "commit-hash" ]; then
export GIT_AUTHOR_DATE="2026-01-15 00:00:00"
export GIT_COMMITTER_DATE="2026-01-15 00:00:00"
fi
' parent-hash..HEAD常见问题
Q: 为什么 Git 要有两个时间?
A: 这是为了区分"谁写的代码"和"谁提交的代码"。在团队协作中很有用:
场景 1: 代码审查
# 小明写了代码
git commit -m "feat: 添加功能"
# Author: 小明, Author Date: 2026-01-15
# 小红审查后合并(使用 cherry-pick)
git cherry-pick abc123
# Author: 小明, Author Date: 2026-01-15 (保留原作者)
# Committer: 小红, Committer Date: 2026-01-16 (记录合并者)场景 2: 补丁应用
# 开源项目收到贡献者的补丁
git am < patch.diff
# Author: 贡献者, Author Date: 补丁创建时间
# Committer: 维护者, Committer Date: 应用补丁时间Q: 为什么时间是 00:00:00?
A: 当你只输入日期(YYYY-MM-DD)时,时间会默认为 00:00:00。这是为了简化操作,大多数情况下我们只关心日期。
如果需要指定精确时间,可以使用完整格式:
# 只输入日期
输入: 2026-01-15
结果: 2026-01-15 00:00:00
# 输入完整时间
输入: 2026-01-15 14:30:00
结果: 2026-01-15 14:30:00Q: 可以修改时间部分吗?
A: 可以!使用完整格式 YYYY-MM-DD HH:mm:ss 即可指定精确时间:
$ gw ad
输入新的日期: 2026-01-15 14:30:00如果需要更灵活的控制,也可以手动使用 git 命令:
# 修改最新 commit 的时间为指定的精确时间
GIT_AUTHOR_DATE="2026-01-15 14:30:00" \
GIT_COMMITTER_DATE="2026-01-15 14:30:00" \
git commit --amend --no-editQ: 什么时候两个时间会不一致?
A: 以下操作会导致两个时间不一致:
- 修改 commit:
git commit --amend会更新 Committer Date - Rebase:
git rebase会更新所有 commit 的 Committer Date - Cherry-pick:
git cherry-pick会保留 Author Date,但设置新的 Committer Date - 手动修改: 使用环境变量单独修改某个时间
示例:
# 原始 commit
git commit -m "feat: 功能"
# Author Date: 2026-01-15 10:00:00
# Committer Date: 2026-01-15 10:00:00
# 修改 commit message
git commit --amend -m "feat: 新功能"
# Author Date: 2026-01-15 10:00:00 (不变)
# Committer Date: 2026-01-15 11:00:00 (更新)Q: 为什么本命令要同时修改两者?
A: 保持时间一致性,避免混淆。如果你需要单独修改某个时间,可以使用原生 git 命令:
# 只修改 Author Date
GIT_AUTHOR_DATE="2026-01-15 00:00:00" git commit --amend --no-edit
# 只修改 Committer Date
GIT_COMMITTER_DATE="2026-01-15 00:00:00" git commit --amend --no-editQ: 修改后如何验证?
A: 使用 gw log 或 git log 查看提交历史,确认时间已更新。
Q: 修改失败怎么办?
A: 如果修改历史 commit 失败,可以使用 git reflog 找回之前的状态:
git reflog
git reset --hard HEAD@{1}