我想改变历史上某个特定承诺的作者。这不是最新的承诺。

相关:如何更改多次提交的作者和提交人姓名/电子邮件?


当前回答

可选:如果不想将本地更改发送到远程,请确保将其隐藏。

$ git status
$ git stash

更新上次提交的作者。

$ git log   // Old author in local and remote
$ git commit --amend --author="Author Name <email@address.com>"
$ git log   // New Author in local
$ git push origin <branch> --force-with-lease 
$ git log   // New Author in remote

然后,如果您使用git stash,则恢复您的暂存更改

$ git stash pop
$ git status

然后,您应该为当前项目的下一次提交更新配置。

$ git config user.name "Author Name"
$ git config user.email "<email@address.com>"

并使用git-config-edit检查或编辑


澄清:在使用$ggpush-f丢失提交的罕见情况下,您可以使用reflog恢复它们。无论如何,在租约中使用--force比只使用-f更能保护您

GL

来源ZSH公司

其他回答

您可以使用下面的命令更改上次提交的作者。

gitcommit--modify--author=“作者名称<email@address.com>"

然而,如果您想更改多个提交的作者名称,这有点棘手。您需要启动一个交互式的rebase,然后将提交标记为edit,然后逐一修改并完成。

使用git rebase-i开始重新定基。它会向你展示这样的东西。

更改pick关键字以编辑要更改作者名称的提交。

然后关闭编辑器。对于初学者,点击Escape,然后键入:wq并点击Enter。

然后你会看到你的终端就像什么都没发生一样。事实上,您正在进行交互式重设基。现在是使用上面的命令修改提交的作者名称的时候了。它将再次打开编辑器。退出并继续使用git rebase重新创建数据库--继续。对要编辑的提交计数重复相同的操作。您可以确保在执行No rebase时完成交互式rebase?消息

作为Eugen Konkov回答的补充,可以保留提交/作者日期。要只修改作者而不修改最后三次提交的日期,请使用

git rebase --onto HEAD~3 --exec 'GIT_COMMITTER_DATE="$(git log -n 1 --format=%aD)" git commit --amend --reset-author --no-edit --date="$(git log -n 1 --format=%aD)"' HEAD~3

然后用力推

git push --force-with-lease

这个问题的公认答案是交互式rebase的巧妙使用,但不幸的是,如果我们试图更改作者的提交曾经位于一个随后被合并的分支上,则会出现冲突。更一般而言,它在处理混乱的历史时不起作用。

由于我担心运行依赖于设置和取消设置环境变量来重写git历史的脚本,因此我正在根据这篇文章编写一个新的答案,该答案与此答案类似,但更完整。

与链接的答案不同,以下内容经过测试并有效。为了说明清楚,假设03f482d6是我们试图替换其作者的提交,42627abe是新作者的提交。

签出我们试图修改的提交。git结帐03f482d6让作者改变。gitcommit--modify--author“新作者姓名<新作者电子邮件>”

现在我们有了一个新的提交,哈希值假定为42627abe。

签出原始分支。用本地新提交替换旧提交。git替换03f482d6 42627abe基于替换重写所有未来提交。git筛选器分支--全部拆下替换件以保持清洁。git替换-d 03f482d6推送新的历史记录(仅在以下操作失败时使用--force,并且仅在使用gitlog和/或gitdiff进行健全性检查后使用)。git push—强制执行租约

而不是4-5,你可以重新开始新的提交:

git rebase -i 42627abe

如果您需要更改的是上一次提交的作者,而没有其他人正在使用您的存储库,您可以使用以下方法撤消上一次的提交:

git push -f origin last_commit_hash:branch_name 

更改提交的作者名称:

git commit --amend --author "type new author here"

退出打开的编辑器并再次推送代码:

git push

在全球范围内更改提交人姓名和电子邮件:

$ git config --global user.name "John Doe"
$ git config --global user.email "john@doe.org"

更改每个存储库的提交人名称和电子邮件:

$ git config user.name "John Doe"
$ git config user.email "john@doe.org"

仅为下一次提交更改作者信息:

$ git commit --author="John Doe <john@doe.org>"

提示:对于其他情况和阅读更多信息,请阅读帖子参考。