我想改变历史上某个特定承诺的作者。这不是最新的承诺。
相关:如何更改多次提交的作者和提交人姓名/电子邮件?
我想改变历史上某个特定承诺的作者。这不是最新的承诺。
相关:如何更改多次提交的作者和提交人姓名/电子邮件?
当前回答
对于这个问题,也有一种懒惰的方法,特别是当您有多个提交需要更改时。在我的案例中,我有一个新的分支,它与错误的作者进行了多次提交,所以是什么帮助了我:
转到您的原始分支:
git checkout develop
从中创建新分支:
git checkout -b myFeature develop
将其合并为一次提交,但不包含提交信息:
git merge --no-commit --squash branchWrongAuthor
您可能还想进行更改:
git stage .
更改作者姓名并提交更改:
git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"
就这样,你可以推动改变。
git push
之后,您可以删除具有错误作者的分支。
其他回答
对于合并提交消息,我发现我不能通过使用rebase来修改它,至少在gitlab上是这样。它将合并显示为提交,但我无法重新基于该#sha。我发现这篇文章很有用。
git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
这三行代码完成了更改合并提交消息的工作(如作者)。
交互式重新基准历史中比您需要修改的提交更早的一点(git rebase-i<earlier commit>)。在要重设基础的提交列表中,将要修改的提交的哈希旁边的文本从pick更改为edit。然后,当git提示您更改提交时,使用以下命令:
git commit --amend --author="Author Name <email@address.com>" --no-edit
例如,如果您的提交历史是A-B-C-D-E-F,F是HEAD,并且您想更改C和D的作者,那么您应该。。。
指定gitrebase-i B(以下是执行gitrebase-iB命令后将看到的示例)如果需要编辑A,请使用git-rebase-i--root将C和D的行从拾取更改为编辑退出编辑器(对于vim,这将是按Esc,然后键入:wq)。一旦重新启动,它将首先在C处暂停您可以gitcommit--modify--author=“作者姓名”<email@address.com>"然后git rebase--继续它会在D时再次暂停然后您将gitcommit--modify--author=“作者姓名”<email@address.com>“”再次git rebase—继续重新基础将完成。使用git push-f使用更新的提交更新源代码。
如果要更改的提交不是最后一次提交,请执行以下步骤。如果您的提交位于不同的分支,那么首先切换到该分支。
git签出分支名称
在要更改的提交之前查找提交并查找其哈希。然后发出rebase命令。
git rebase-i-p提交哈希
然后将打开一个编辑器,并输入“edit”以查看要更改的提交。让其他人保留默认的“选择”选项。一旦更改,输入“esc”键和wq!退出。
然后发出带有修正选项的gitcommit命令。
gitcommit--modify--author=“用户名电子邮件”--无编辑
然后发出以下命令。
git rebase—继续
在本地存储库中更新提交作者后,将更改推送到远程存储库。
溶液
安装git filter repo(git项目建议在filter分支上安装filter repo)$PACKAGE_TOOL安装git筛选器repo在git存储库的根目录中创建一个文件.mailmap,其中包含新名称<new@ema.il> <old@ema.il>运行gitfilter repo--使用mailmap
更多详细信息
gitfilter repo在其文档中将其列为示例不要像上面的示例那样替换名称和电子邮件,请查看gitmailmap文档中的其他示例您可以通过使用参数--mailmap<filename>调用gitfilter repo来指定mailmap文件,而不是默认使用名为.mailmap的文件。关于如何进一步过滤分支/标签/任何内容的更多示例,可以在gitfilter repo项目的README.md中找到。
使用交互式回扣
git rebase -i -p <some HEAD before all of your bad commits>
然后在rebase文件中将所有错误提交标记为“edit”,当git要求您修改每个提交时
git commit --amend --author "New Author Name <email@address.com>"
编辑或关闭打开的编辑器,然后执行
git rebase --continue
以继续重新启动。
您可以通过附加--no edit来跳过在此处完全打开编辑器,这样命令将是:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
单次提交
正如一些评论所指出的,如果您只想更改最近的提交,那么rebase命令是不必要的。就这样吧
git commit --amend --author "New Author Name <email@address.com>"
这会将author更改为指定的名称,但committer将设置为gitconfig user.name和gitconfig user.email中配置的用户。如果要将committer设置为指定的值,这将同时设置author和committer:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author