如何更改一个特定提交的提交作者?

时间:2010-06-15 04:00:09

标签: git git-commit

我想更改历史记录中某个特定提交的作者。这不是最后一次提交。

我知道这个问题 - How do I change the author of a commit in git?

但我正在思考一些事情,我通过哈希或短哈希识别提交。

22 个答案:

答案 0 :(得分:2916)

历史记录中某个点的交互式rebase不是您需要修改的提交(git rebase -i <earliercommit>)。在要重新提交的提交列表中,将文本从pick更改为要修改的哈希旁边的edit。然后,当git提示您更改提交时,请使用:

git commit --amend --author="Author Name <email@address.com>"

例如,如果您的提交历史记录为A-B-C-D-E-FFHEAD,并且您想要更改CD的作者,那么你会...

  1. 指定git rebase -i Bhere is an example of what you will see after executing the git rebase -i B command
    • 如果您需要修改A,请使用git rebase -i --root
  2. CD的行从pick更改为edit
  3. 一旦rebase开始,它将首先暂停在C
  4. 你会git commit --amend --author="Author Name <email@address.com>"
  5. 然后git rebase --continue
  6. 会在D
  7. 再次暂停
  8. 然后你会再次git commit --amend --author="Author Name <email@address.com>"
  9. git rebase --continue
  10. rebase将完成。
  11. 使用git push -f使用更新的提交更新您的来源。

答案 1 :(得分:404)

这个问题的accepted answer非常巧妙地使用了交互式rebase,但不幸的是,如果我们试图改变曾经的作者在一个随后被合并的分支上的提交,它就会出现冲突。更多一般来说,它在处理混乱的历史时不起作用。

由于我担心运行依赖于设置和取消设置环境变量的脚本来重写git历史记录,我正在编写一个基于this post的新答案,它类似于this answer但更完整。

以下是经过测试和运作的,与链接的答案不同。 假设清楚地说明03f482d6是我们试图替换的作者的提交,42627abe是新作者的提交。

  1. 检查我们尝试修改的提交。

    git checkout 03f482d6
    
  2. 让作者改变。

    git commit --amend --author "New Author Name <New Author Email>"
    

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

  3. 查看原始分支。

  4. 将旧提交替换为本地新提交。

    git replace 03f482d6 42627abe
    
  5. 根据替换重写所有未来的提交。

    git filter-branch -- --all
    
  6. 取消更换清洁度。

    git replace -d 03f482d6
    
  7. 推送新的历史记录(如果以下内容失败,则仅使用--force,并且仅在使用git log和/或git diff进行完整性检查后才使用。

    git push --force-with-lease
    
  8. 而不是4-6,你可以直接重新加入新的提交:

    git rebase -i 42627abe
    

答案 2 :(得分:173)

Github文档包含a script that replaces the committer info for all commits in a branch

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

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

答案 3 :(得分:100)

  • 将您的电子邮件重置为全局配置:

    git config --global user.email example@email.com

  • 现在重置您的提交作者,无需编辑:

    git commit --amend --reset-author --no-edit

答案 4 :(得分:74)

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

git commit --amend --author="Author Name <email@address.com>"

但是,如果您想更改多个提交作者姓名,则有点棘手。您需要启动交互式rebase,然后将提交标记为编辑,然后逐个修改它们并完成。

使用git rebase -i开始变基。它会告诉你这样的事情。

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

为要更改作者姓名的提交,将pick关键字更改为edit

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

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

然后你会看到你的终端没有发生任何事情。实际上你正处于交互式变基的中间。现在是时候使用上面的命令修改提交的作者姓名了。它将再次打开编辑器。退出并继续使用git rebase --continue进行变基。对要编辑的提交计数重复相同的操作。收到No rebase in progress?消息后,您可以确保交互式rebase已完成。

答案 5 :(得分:49)

您链接的问题中的答案是很好的答案并涵盖您的情况(另一个问题是更一般的,因为它涉及重写多次提交)。

作为尝试git filter-branch的借口,我写了一个脚本来重写给定提交的作者姓名和/或作者电子邮件:

#!/bin/sh

#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
#     If -f is supplied it is passed to "git filter-branch".
#
#     If <branch-to-rewrite> is not provided or is empty HEAD will be used.
#     Use "--all" or a space separated list (e.g. "master next") to rewrite
#     multiple branches.
#
#     If <new-name> (or <new-email>) is not provided or is empty, the normal
#     user.name (user.email) Git configuration value will be used.
#

force=''
if test "x$1" = "x-f"; then
    force='-f'
    shift
fi

die() {
    printf '%s\n' "$@"
    exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"

TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL

filt='

    if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
        if test -n "$TARG_EMAIL"; then
            GIT_AUTHOR_EMAIL="$TARG_EMAIL"
            export GIT_AUTHOR_EMAIL
        else
            unset GIT_AUTHOR_EMAIL
        fi
        if test -n "$TARG_NAME"; then
            GIT_AUTHOR_NAME="$TARG_NAME"
            export GIT_AUTHOR_NAME
        else
            unset GIT_AUTHOR_NAME
        fi
    fi

'

git filter-branch $force --env-filter "$filt" -- $br

答案 6 :(得分:22)

之前提交:

enter image description here

要修复所有提交的作者,您可以从@Amber的答案中应用命令:

git commit --amend --author="Author Name <email@address.com>"

要重用您的姓名和电子邮件,您可以写:

git commit --amend --author=Eugen

在命令后提交:

enter image description here

例如,从4025621开始更改所有内容:

enter image description here

您必须运行:

git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621

注意:要包括一个包含空格(例如姓名和电子邮件地址)的作者,该作者必须用转义的引号引起来。例如:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621

或将此别名添加到~/.gitconfig中:

[alias]
    reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --

然后运行:

git reauthor 4025621 Eugen

答案 7 :(得分:19)

找到一种可以快速更改用户并且对其他提交没有副作用的方法。

简单明了的方式:

git config user.name "New User"
git config user.email "newuser@gmail.com"

git log
git rebase -i 1f1357
# change the word 'pick' to 'edit', save and exit

git commit --amend --reset-author --no-edit
git rebase --continue

git push --force-with-lease

详细操作

  • 显示提交日志并找出要更改的提交之前的提交ID:
git log
  • git rebase从所选的提交ID开始到最近的反向提交:
git config user.name "New User"
git config user.email "newuser@gmail.com"
git rebase -i 1f1357

# change word pick to edit, save and exit
edit 809b8f7 change code order 
pick 9baaae5 add prometheus monitor kubernetes
edit 5d726c3 fix liquid escape issue   
edit 3a5f98f update tags
pick 816e21c add prometheus monitor kubernetes
  • rebase将在下一个提交ID处停止,输出:
Stopped at 809b8f7...  change code order 
You can amend the commit now, with
  git commit --amend 

Once you are satisfied with your changes, run

  git rebase --continue
  • 确认并继续您的基础,直到成功将其移至refs/heads/master.
# each continue will show you an amend message
# use git commit --amend --reset-author --no-edit to comfirm
# use git rebase --skip to skip
git commit --amend --reset-author --no-edit
git rebase --continue
git commit --amend --reset-author --no-edit
...
git rebase --continue
Successfully rebased and updated refs/heads/master.
  • git push更新
git push --force-with-lease

答案 8 :(得分:12)

在执行git rebase -i时,文档中有一个有趣的内容:

  

如果要将两个或多个提交折叠为一个,请将"pick"命令替换为"squash""fixup"的第二次和后续提交。如果提交具有不同的作者,则折叠的提交将归因于第一次提交的作者。折叠提交的建议提交消息是第一次提交的提交消息和具有"squash"命令的提交消息的串联,但是省略了使用"fixup"命令提交的提交消息。

  • 如果您的历史记录为A-B-C-D-E-F
  • 并且您想要更改提交BD(= 2次提交),

然后你可以这样做:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • 创建空提交(每次提交一次):
    • 您需要一条用于改变目的的消息
    • git commit --allow-empty -m "empty"
  • 启动rebase操作
    • git rebase -i B^
    • B^选择B的父级。
  • 您需要在每次提交修改
  • 之前提交一个空提交
  • 您需要将pick更改为squash

git rebase -i B^会给你的例子:

pick sha-commit-B some message
pick sha-commit-C some message
pick sha-commit-D some message
pick sha-commit-E some message
pick sha-commit-F some message
# pick sha-commit-empty1 empty
# pick sha-commit-empty2 empty

将其更改为:

# change commit B's author
pick sha-commit-empty1 empty
squash sha-commit-B some message
# leave commit C alone
pick sha-commit-C some message
# change commit D's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message

它会提示您编辑消息:

# This is a combination of 2 commits.
# The first commit's message is:

empty

# This is the 2nd commit message:

...some useful commit message there...

你可以删除前几行。

答案 9 :(得分:12)

如果您使用的是集中式存储库,则Amber's answer还有一个步骤:

git push -f强制更新中央存储库。

请注意,没有很多人在同一个分支上工作,因为它会破坏一致性。

答案 10 :(得分:3)

全局更改您的提交人姓名和电子邮件:

$ 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>"

提示:有关其他情况和更多信息,请阅读the post reference

答案 11 :(得分:2)

如果您的机器上缺少设置,例如在格式化之后,或者在没有设置(正确)这些命令的情况下没有正确配置 Git 时,可能会发生这种情况。

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

关注this article by Atlassian为什么不让您的生活更简单?

  1. git commit --amend --author="Author Name <email@address.com>"
  2. 取消保护您的分支(如果它受到保护)。在这个例子中,它是 master;因此,它将受到源代码存储库的保护
  3. git push origin master --force

这是最后一次提交的最简单场景。要获取任何“随机”提交,您需要:

  1. git rebase -i <Earlier Commit>.
  2. 在您感兴趣的那个提交的 pick 上更改 edit
  3. git commit --amend --author="Author Name <email@address.com>"
  4. 取消保护您的分支(如果它受到保护)。在这个例子中,它是 master;因此,它将受到源代码存储库的保护
  5. git push origin master --force

您可以随时git log在推送​​之前确定自己的位置。

答案 12 :(得分:2)

解决方案

  1. 安装 git filter-repo (Git 项目 recommends filter-repo over filter-branch

    $ PACKAGE_TOOL install git-filter-repo
    
  2. 在包含

    的git仓库的根目录下创建一个文件.mailmap
    New Name <new@ema.il> <old@ema.il>
    
  3. 运行git filter-repo --use-mailmap


更多详情

  • git-filter-repo 将此列为 an example in their docs
  • 不要像上面的示例那样根据电子邮件过滤器替换姓名和电子邮件,而是查看 git mailmap documentation
  • 中的其他示例
  • 您可以通过使用参数 .mailmap 调用 git filter-repo 来指定您自己的文件,而不是使用默认的 --mailmap <filename> 文件。
  • git-filter-repo project's README.md 中可以找到更多关于如何进一步过滤分支/标签/任何内容的示例。

答案 13 :(得分:2)

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

$ 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-with-lease都比仅使用-f

受保护的程度更大

GL

答案 14 :(得分:2)

您可以在github的官方页面上使用这些命令

https://help.github.com/en/github/using-git/changing-author-info

这是命令

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

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

在这里您可以将旧电子邮件更改为新的用户名和电子邮件地址。

答案 15 :(得分:1)

对于投票最多的问题,有一个快捷方式:使用 exec 而不是 edit

exec 允许在指定的提交上运行命令。
使用它可以避免使用 edit,退出到终端并为每个 git commit 运行 git 命令。
如果您必须更改历史记录中的多个提交,这将特别有用。

步骤是:

  1. 对较早的提交 (git rebase -i <earliercommit>) 执行变基
  2. 在打开的编辑器中,在您要编辑的每个提交行之后添加一行并添加 exec git commit --amend --author="Author Name <email@address.com>" --no-edit(如果您想重置为 git config 中设置的值,则使用 --reset-author
  3. 保存并退出 - 这将为每次提交运行指定的命令,有效地更改作者

示例编辑器内容(更改前 2 个提交作者):

pick 1fc6c95 Patch A
exec git commit --amend --author="Author Name <email@address.com>" --no-edit
pick 6b2481b Patch B
exec git commit --amend --author="Author Name <email@address.com>" --no-edit
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B

# Rebase 41a72e6..7b36971 onto 41a72e6
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

答案 16 :(得分:1)

对于合并提交消息,我发现至少在gitlab上,无法使用rebase对其进行修改。它将合并显示为提交,但是我无法基于该#sha。我发现this帖子很有帮助。

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

这三行代码完成了更改合并提交消息(如作者)的工作。

答案 17 :(得分:1)

在落实提交后重命名作者姓名的步骤

  1. 首先输入“ git log”以获取提交ID和更多详细信息
  2. git rebase i HEAD〜10(10是要显示在rebase上的总提交次数)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip) If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. 然后根据需要输入“ git rebase --continue”或“ git rebase --abort”

    • 现在将打开“将变基”窗口,点击键盘上的“ i”键
    • 然后您将获得10个提交的列表[因为我们已经通过了10个以上的提交] 如下所示

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. 现在,您需要在要编辑的提交的下方添加以下命令,例如以下

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <author.name@mail.com>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>'

    1. 就是这样,现在只需按ESC,:wq,就可以设置了

    2. 然后git push origin HEAD:分支名称-f [请注意-f Force push]

    git push -fgit push origin HEAD: dev -f

答案 18 :(得分:1)

如果您要更改的提交不是最后的提交,请执行以下步骤。如果您的提交在另一个分支中,请首先切换到该分支。

git checkout branch_name

在要更改的提交之前找到提交,并找到其哈希值。然后发出rebase命令。

git rebase -i -p提交哈希

然后,将打开一个编辑器,并为要更改的提交输入“ edit”。让其他人使用默认的“ pick”选项。更改后,请输入“ esc”键并输入密码!退出。

然后发出带有修订选项的git commit命令。

git commit --amend --author =“用户名电子邮件”-无需编辑

然后发出以下命令。

git rebase --continue

在本地存储库中更新提交作者后,将更改推送到远程存储库中。

答案 19 :(得分:0)

对于这个问题,还有一种懒惰的方法,尤其是当您要更改多个提交时。在我的情况下,我有一个新分支,其中有多个提交带有错误的作者,因此对我有帮助:

转到原始分支

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

之后,您可以使用错误的作者删除分支。

答案 20 :(得分:0)

为了增强Eugen Konkov的响应,从{root}提交开始,请使用--root标志。 --no-edit标志也很有帮助

git rebase --onto <sha> --exec "git commit --amend --author='name <email>' --no-edit" --root

答案 21 :(得分:0)

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

display: table

使用以下命令更改提交的作者姓名:

git push -f origin last_commit_hash:branch_name 

退出打开的编辑器,然后再次推送您的代码:

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