如何复现PR提交历史的作者变更?无需git commit --amend可行吗?
PR提交作者变更的可能方式及rebase相关疑问
我想了解PR提交历史出现如下作者变更的所有可能方式,是否可以不通过git commit --amend --author="xxx"实现?我在分支完成工作后返回,发现所有提交的作者变为<my-coworker>,但提交内容完全一致。
场景1
初始状态
<my-user> 发起PR <my-user> 添加了N个提交: * <my-commit-1> by <my-user> * <my-commit-2> by <my-user>
新状态
<my-user> 发起PR <my-coworker> 强制推送<this-prs-branch>从<ref>到<ref> <my-coworker> 添加了N个提交: * <my-commit-1> by <my-coworker> * <my-commit-2> by <my-coworker> * 其他提交 by <my-coworker> <my-coworker> 强制推送<this-branch>从<ref>到<ref>
场景2
初始状态
<my-user> 发起PR <my-user> 添加了N个提交: * <my-commit-1> by <my-user> * <my-commit-2> by <my-user>
新状态
<my-user> 发起PR <my-coworker> 添加了N个提交: * <my-commit-1> by <my-coworker> * <my-commit-2> by <my-coworker> * 其他提交 by <my-coworker> <my-coworker> 强制推送<this-prs-branch>从<ref>到<ref>
我可以通过git commit --amend --author='<another-author>'复现场景2,但同事称作者变更是因为将功能分支rebase到master分支导致的。我尝试了不同用户的交互式rebase及冲突处理,仅能得到<my-user>为作者、<another-user>为提交者的提交,无法得到完全由<another-user>作为作者的提交。请问我遗漏了什么?
无需git commit --amend --author的作者变更方式
- 交互式rebase重置作者:执行
git rebase -i HEAD~N(N为要修改的提交数量),在弹出的编辑界面中,将目标提交的指令改为edit。进入编辑模式后,执行git commit --reset-author,此命令会将当前Git配置的用户设为该提交的作者,随后用git rebase --continue完成rebase,最后强制推送分支即可。 - 批量rebase修改作者:使用
git rebase --exec "git commit --reset-author" HEAD~N,批量将指定范围内的所有提交作者重置为当前执行命令的用户,完成后强制推送分支覆盖原提交。 - 克隆后重新提交:同事克隆你的分支,在本地切换Git用户信息为自己的账号,然后用
git cherry-pick将你的所有提交重新应用一遍,新提交的作者会是同事的账号,最后强制推送到原分支。 - 用git filter-repo批量替换:借助
git filter-repo工具,通过脚本或参数批量替换指定作者的信息,示例命令:
执行后强制推送分支,所有匹配的提交作者都会被替换。git filter-repo --commit-callback ' if commit.author_email == b"your-email@example.com": commit.author_name = b"my-coworker" commit.author_email = b"coworker-email@example.com" '
rebase导致作者变更的关键操作
你之前尝试rebase仅保留原作者的原因是,默认rebase会继承原提交的作者信息。要让rebase修改作者,需要主动触发以下操作:
- 在交互式rebase的编辑环节,对目标提交选择
edit,修改时执行git commit --reset-author,而非直接git commit --no-edit。 - 若在rebase解决冲突后提交,使用
git commit --no-edit --reset-author,会将当前用户设为提交的作者,而非保留原作者。 - 同事也可能临时修改了本地Git配置(
git config user.name/git config user.email),或设置了环境变量GIT_AUTHOR_NAME、GIT_AUTHOR_EMAIL,再执行rebase并重置作者,从而生成作者为自己的提交。
内容的提问来源于stack exchange,提问作者burn
相关产品推荐
相关产品推荐

