在一个特定的提交更改提交作者

我想改变历史中某个特定提交的作者。 这不是最后的提交。

我知道这个问题 – 我如何改变git提交作者?

但是我在思考什么,在哪里我通过哈希或短哈希来确定提交。

在历史早期的一个点上交互git rebase -i <earliercommit>比你需要修改的提交( git rebase -i <earliercommit> )。 在被重新设置的提交列表中,将文本从pick更改为要edit的哈希旁边的edit 。 然后,当git提示你改变提交,使用这个:

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

例如,如果您的提交历史logging是以F作为HEAD ABCDEF ,并且您想要更改CD的作者,那么您将…

  1. 指定git rebase -i B (注意:如果是A ,则需要编辑,使用git rebase -i --root
  2. 更改CD的行以进行edit
  3. 一旦开始了rebase,它会先在C停下来
  4. 你会git commit --amend --author="Author Name <email@address.com>"
  5. 然后git rebase --continue
  6. 它会在D再次停顿
  7. 然后你会再次git commit --amend --author="Author Name <email@address.com>"
  8. git rebase --continue
  9. 基地将完成。

这个问题被接受的答案是巧妙地使用了交互式的rebase,但是不幸的是,如果我们试图改变原来的作者在后来合并的一个分支上的提交,那么它就会performance出冲突。更普遍的说,它不起作用处理凌乱的历史。

由于我担心运行的脚本依赖于设置和取消设置环境variables来重写git历史logging,我正在写一个基于这个post的新答案, 这个答案类似于这个答案,但是更完整。

以下是testing和工作,不像链接的答案。 假设为了清楚地说明03f482d6是我们试图replace的作者, 42627abe是新作者的承诺。

  1. 检出我们试图修改的提交。

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

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

    然后检查原来的分支。

  3. 在本地replace旧的提交。

     git replace 03f482d6 42627abe 
  4. 根据replace重写所有将来的提交。

     git filter-branch -- --all 
  5. 取下更换的清洁。

     git replace -d 03f482d6 
  6. 推新的历史logging(只有在下面的失败时才使用–force,只有在使用git log和/或git diff进行完整性检查之后)。

     git push --force-with-lease 

Github文档包含一个脚本,用于replace分支中所有提交的提交者信息 。

 #!/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 

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

作为尝试使用git filter-branch的借口,我编写了一个脚本来为给定的提交重写Author Name和/或Author Email:

 #!/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 (eg "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" = "xf"; 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 

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

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

但是,如果你想改变多个提交作者的名字,这有点棘手。 你需要开始一个交互式的rebase然后标记提交作为编辑,然后逐个修正他们并完成。

git rebase -i开始重新绑定。 它会告诉你这样的事情。

file/a2uqfmsRjtJyn3p4KtjuTX7XMaDZHu.html

更改pick关键字以edit您想要更改作者姓名的提交。

file/a2uqfmsRjtJyn3p4KtjuTX7XMaDZHu.html

然后closures编辑器。 对于初学者来说,打Escape键入:wq然后Enter

然后你会看到你的terminal像什么都没有发生。 其实你正处在一个互动式的重新组合中。 现在是时候用上面的命令修改你的提交的作者名字了。 它会再次打开编辑器。 退出并继续用git rebase --continue继续。 对要编辑的提交计数重复同样的操作。 您可以确保当您No rebase in progress?时完成交互式重新分配No rebase in progress? 信息。

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

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

  • 现在重置你的提交的作者而不需要编辑:

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

如果您使用集中式存储库, Amber的答案还有一个步骤:

git push -f强制中央资源库的更新。

要小心,在同一个分支上工作的人不多,因为这会破坏一致性。

在做git rebase -i时,doc中有这个有趣的地方:

如果要将两个或多个提交合并成一个提交,请用"squash""fixup"replace第二个和后续提交的命令"pick" "fixup" 。 如果这个提交有不同的作者,那么这个提交将被归于第一个提交的作者。 build议提交的提交消息是第一次提交和"squash"命令的提交消息的连接,但省略了提交"fixup"命令的提交消息。

  • 如果您有ABCDEF的历史logging,
  • 你想改变提交BD (= 2提交),

那么你可以这样做:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • 创build空提交(每个提交一个):
    • 你需要一个消息来rebase目的
    • git commit --allow-empty -m "empty"
  • 开始rebase操作
    • git rebase -i B^
    • B^selectB^的父亲。
  • 你会希望每次提交修改都要提交一个空的提交
  • 你会想改变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 EF 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... 

你可以删除前几行。