Git 更改未推送提交的作者

Bub*_*lik 3 git commit

我有两次提交,(已经提交了错误的电子邮件)所以我的推送被拒绝了。如何在不丢失更改的情况下更改这些提交的电子邮件?

Ser*_*gej 7

已经有了这个答案

使用交互式变基

你可以做

git rebase -i -p <some HEAD before all of your bad commits>
Run Code Online (Sandbox Code Playgroud)

然后在 rebase 文件中将所有错误提交标记为“编辑”。如果您还想更改您的第一次提交,则必须手动将其添加为 rebase 文件中的第一行(遵循其他行的格式)。然后,当 git 要求您修改每个提交时,请执行

git rebase -i -p <some HEAD before all of your bad commits>
Run Code Online (Sandbox Code Playgroud)

编辑或关闭打开的编辑器,然后执行

git rebase --continue
Run Code Online (Sandbox Code Playgroud)

继续rebase。

您可以通过追加来完全跳过在此处打开编辑器,--no-edit 以便命令为:

 git commit --amend --author "New Author Name <email@address.com>" 
Run Code Online (Sandbox Code Playgroud)

单次提交

正如一些评论者所指出的,如果您只想更改最近的提交,则不需要 rebase 命令。做就是了

git rebase --continue
Run Code Online (Sandbox Code Playgroud)

这会将作者更改为指定的名称,但提交者将设置为您在git config user.name和 中配置的用户git config user.email。如果您想将提交者设置为您指定的内容,这将同时设置作者和提交者:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Run Code Online (Sandbox Code Playgroud)

关于合并提交的说明

我原来的回答有一点瑕疵。如果当前HEAD和您的之间有任何合并提交<some HEAD before all your bad commits>,那么git rebase会将它们展平(顺便说一下,如果您使用 GitHub 拉取请求,您的历史记录中将会有大量的合并提交)。这通常会导致非常不同的历史记录(因为重复的更改可能会被“重新定位”),在最坏的情况下,它可能会导致git rebase要求您解决困难的合并冲突(这些冲突可能已经在合并提交中解决了)。解决方案是使用-p标志 to git rebase,这将保留历史的合并结构。手册页git rebase警告说,使用-p-i可能会导致问题,但在BUGS 它说“编辑提交和改写他们的提交消息应该可以正常工作。”

我已经添加-p到上面的命令中。对于您只是更改最近提交的情况,这不是问题。

在这篇文章中:在 Git 中更改多次提交的作者和提交者姓名和电子邮件