执行Git rebase操作时如何不修改未编辑提交的committer信息
Git rebase修改历史作者时保留其他提交committer信息的解决方案
问题根因
Git的每个commit包含两类身份标识:
author:代码的实际编写提交者committer:最后将该commit纳入仓库的操作者
rebase操作的本质是重写目标分支所有涉及的commit哈希,因此默认会把所有经过重写的commit的committer信息更新为当前操作的用户和当前时间,哪怕你没有修改这些commit的内容,就会出现其他协作者的提交显示你为committer的问题。
推荐方案:使用git filter-repo批量修改指定提交的作者
这是Git官方推荐的历史修改工具,只会修改你指定匹配规则的提交,完全不会改动其他提交的任何元信息,操作更安全,步骤如下:
- 确保仓库已经重置到rebase前的干净状态,无未提交的变更
- 执行以下命令,替换其中的对应参数为你自己的信息:
git filter-repo --commit-callback ' # 匹配你需要修改的旧作者邮箱 if commit.author_email == b"your_old_email@example.com": commit.author_name = b"Your Correct Username" commit.author_email = b"your_new_email@example.com" '
- 执行完成后检查提交历史,只有你匹配到的提交的作者信息会被修改,其他协作者的提交的author、committer信息完全不变。
提示:如果你的环境没有预装
git filter-repo,可通过pip、brew、apt等常用包管理器直接安装。
备选方案:交互式rebase场景下保留committer信息
如果你必须使用交互式rebase完成修改,可以在执行rebase前设置配置项强制复用原有committer信息,Git 2.38及以上版本支持以下操作:
- 执行以下命令开启保留committer配置:
git config rebase.updateCommitter never
- 按照你原来的步骤执行交互式rebase修改指定提交的作者即可,未编辑的提交会保留原有committer信息。
- 操作完成后可以按需恢复默认配置:
git config --unset rebase.updateCommitter
注意:修改仓库历史提交后需要执行强制推送更新远端分支,操作前请务必同步所有协作者,避免影响其他人的本地开发分支。
内容的提问来源于stack exchange,提问作者Coder Cow
相关产品推荐
相关产品推荐

