交互式 rebase 偏离历史记录中的某个点而不是您需要修改的提交( git rebase -i <earliercommit>
)。在要重新提交的提交列表中,将文本从pick
更改为要edit
的哈希旁边的edit
。然后,当 git 提示您更改提交时,请使用以下命令:
git commit --amend --author="Author Name <[email protected]>"
例如,如果您的提交历史记录是ABCDEF
其中F
为HEAD
,并且您想要更改C
和D
的作者,那么您将......
git rebase -i B
( 这是执行git rebase -i B
命令后将看到的示例 ) A
,请使用git rebase -i --root
pick
到edit
更改C
和D
的行C
暂停git commit --amend --author="Author Name <[email protected]>"
git rebase --continue
D
再次暂停git commit --amend --author="Author Name <[email protected]>"
git rebase --continue
git push -f
使用更新的提交更新您的源。 这个问题的接受答案是巧妙地巧妙地使用了交互式 rebase,但不幸的是,如果我们试图改变曾经的作者在一个随后被合并的分支上的提交,它会表现出冲突。更一般地说,它不起作用在处理凌乱的历史时。
因为我担心运行依赖于设置和取消设置环境变量的脚本来重写 git 历史记录,所以我根据这篇文章写了一个新的答案, 这个答案类似于这个答案但更完整。
与链接的答案不同,以下内容经过测试和运行。为了清楚地说明03f482d6
是我们试图替换的作者的提交, 42627abe
是新作者的提交。
签出我们试图修改的提交。
git checkout 03f482d6
让作者改变。
git commit --amend --author "New Author Name <New Author Email>"
现在我们有一个新的提交,哈希假定为42627abe
。
签出原始分支。
在本地替换旧的提交。
git replace 03f482d6 42627abe
根据替换重写所有未来的提交。
git filter-branch -- --all
取下更换清洁度。
git replace -d 03f482d6
推送新的历史记录(如果以下操作失败,则仅使用 --force,并且仅在使用git log
和 / 或git diff
进行完整性检查后)。
git push --force-with-lease
而不是 4-6 你可以改变到新的提交:
git rebase -i 42627abe
Github 文档包含一个脚本,用于替换分支中所有提交的提交者信息 。
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags