乐闻世界logo
搜索文章和话题

How can i change the commit author for a single commit?

7 个月前提问
3 个月前修改
浏览次数194

7个答案

1
2
3
4
5
6
7

要更改某次提交记录的提交作者,可以使用git commit --amend命令来修改最近的提交,或者如果需要更改更早的提交,则可以使用git rebase命令。下面我会详细解释这两种情况的操作步骤。

使用git commit --amend

如果你要更改的是最近的提交,可以使用git commit --amend选项来重新指定提交作者。以下是操作步骤:

  1. 打开命令行或终端。

  2. 切换到需要更改提交作者的仓库目录。

  3. 执行以下命令来更改最近一次提交的作者信息:

    sh
    git commit --amend --author="新作者名 <新作者邮箱>"

    例如,如果我要将作者更改为“John Doe”和他的邮箱“johndoe@example.com”,命令将是:

    sh
    git commit --amend --author="John Doe <johndoe@example.com>"
  4. 这会打开一个文本编辑器,允许你修改提交信息。保存并关闭编辑器后,提交的作者信息将被更新。

请注意,这种方式会修改最后一次提交并创建一个新的提交哈希,所以如果您已经将提交推送到远程仓库,之后必须使用git push --force来覆盖远程仓库上的提交记录。

使用git rebase

如果需要更改较早的提交记录的作者,可以使用git rebase命令。这里是一个简化的例子:

  1. 打开命令行或终端。

  2. 切换到你的仓库目录。

  3. 找出需要修改作者的提交的哈希值。可以使用git log查看提交历史。

  4. 运行git rebase命令开始交互式变基操作:

    sh
    git rebase -i <哈希值的前一次提交>

    例如,如果哈希值是abcd1234,则命令将是:

    sh
    git rebase -i abcd1234^
  5. 在打开的文本编辑器中,将要更改的提交前面的pick改为edit

  6. 保存并关闭编辑器。

  7. 当rebasing到指定的提交时,执行以下命令来更改作者信息:

    sh
    git commit --amend --author="新作者名 <新作者邮箱>"

    使用相同的例子,“John Doe”的命令将是:

    sh
    git commit --amend --author="John Doe <johndoe@example.com>"
  8. 完成作者信息的修改后,继续rebase进程:

    sh
    git rebase --continue
  9. 如果有冲突,解决它们并使用git add将更改的文件标记为已解决。

  10. 重新运行git rebase --continue直到rebase完成。

由于这将改变历史中每个后续提交的哈希值,如果这些提交已经被推送到远程仓库,你可能需要使用git push --force来更新远程仓库。

在执行这些操作时,请务必意识到,修改公共历史是一个危险的行为,因为它可以对其他协作者造成混淆和额外的工作。因此,这些操作应该只在确实必要,且仓库的其他协作者都同意的情况下进行。

2024年6月29日 12:07 回复

从历史记录中比您需要修改的提交更早的点进行交互式变基 ( git rebase -i <earliercommit>)。在要重新设置基准的提交列表中,将文本从pick更改edit为要修改的哈希值旁边的文本。然后当 git 提示您更改提交时,请使用以下命令:

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

例如,如果您的提交历史记录是as A-B-C-D-E-F,并且您想更改和的作者,那么您会...F``HEAD``C``D

  1. 指定git rebase -i B(这是执行命令后您将看到的示例git rebase -i B
    • 如果您需要编辑A,请使用git rebase -i --root
  2. C将和Dfrompick的行更改为edit
  3. 退出编辑器(对于 vim,这将是按 Esc,然后键入:wq)。
  4. 一旦变基开始,它首先会暂停在C
  5. 你会git commit --amend --author="Author Name <email@address.com>"
  6. 然后git rebase --continue
  7. 它会再次暂停在D
  8. 然后你git commit --amend --author="Author Name <email@address.com>"又会
  9. git rebase --continue
  10. 变基将完成。
  11. 用于使用git push -f更新的提交来更新您的源。
2024年6月29日 12:07 回复

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

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

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

  1. 检查我们正在尝试修改的提交:

    shell
    git checkout 03f482d6
  2. 让作者改变:

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

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

  3. 查看原来的分支。

  4. 在本地用新提交替换旧提交:

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

    shell
    git filter-branch -- --all
  6. 取下替换件以保持清洁:

    shell
    git replace -d 03f482d6
  7. 推新历史:

    shell
    git push --force-with-lease

    (仅在后者失败时使用--force--force-with-lease并且仅在使用git logand/or进行健全性检查后使用git diff。)

您可以直接 rebase 到新的提交,而不是执行步骤 4-5:

shell
git rebase -i 42627abe
2024年6月29日 12:07 回复

如果您只想更改上次提交的作者,您可以这样做:

  • 重置当前存储库的作者:

    git config --local user.name "Alex Smith"

    git config --local user.email alex@email.com

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

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

  • 强制推送您的更改而不覆盖其他任何人的提交:

    git push --force-with-lease

请注意,这也会更改作者时间戳。

要对最后 N 次提交执行此操作:

git rebase --onto HEAD~N --exec "git commit --amend --reset-author --no-edit" HEAD~N

2024年6月29日 12:07 回复

Github 文档包含一个脚本,用于替换分支中所有提交的提交者信息(现在无法检索,这是最后一个快照)。

更改变量值后从终端运行以下脚本

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

将更正后的历史记录推送到 GitHub:

shell
git push --force --tags origin 'refs/heads/*'

或者,如果您想推送分支的选定引用,则使用

shell
git push --force --tags origin 'refs/heads/develop'
2024年6月29日 12:07 回复

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

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

然而,如果你想更改多个提交的作者姓名,那就有点棘手了。您需要启动交互式变基,然后将提交标记为编辑,然后一一修改并完成。

  1. 开始变基git rebase -i

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

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

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

2024年6月29日 12:07 回复

在Git中,如果你想要更改单个提交的提交作者,你可以使用git commit --amend --author="Author Name <email@example.com>" 命令。但这只会影响最新的提交。如果你需要更改历史中特定的一个旧的提交,你可以使用git rebase -i 命令,然后选择要修改的提交,并使用rebase期间的edit功能。

下面是详细的步骤来更改一个旧的提交的作者:

  1. 使用git log找到你想要更改的提交的哈希值。

  2. 启动交互式变基操作,选择要修改的提交之前的一个提交作为基础。例如,如果你想要修改的提交哈希是abc123,则执行:

    sh
    git rebase -i abc123^

    注意:^表示选择这个哈希之前的提交,因为我们需要对这个特定的提交作出修改。

  3. 在弹出的编辑器中,你会看到一系列提交列表。找到你想要修改的提交,将它前面的pick改为edit

  4. 保存并退出编辑器。Git现在将会暂停变基操作,并允许你修改那个特定的提交。

  5. 现在你可以使用以下命令来更改提交的作者:

    sh
    git commit --amend --author="New Author Name <newauthor@example.com>" --no-edit

    --no-edit参数表示保持提交信息不变。如果你也想要编辑提交信息,可以省略这个参数。

  6. 一旦完成,继续变基进程:

    sh
    git rebase --continue

    如果有冲突,解决冲突后需要用git add将文件标记为已解决,然后再次运行git rebase --continue

  7. 完成变基后,如果你更改的是已经推送到远程仓库的提交,你需要强制推送你的更改:

    sh
    git push origin branch_name --force

    或者,如果你是在共享分支上工作,可能更喜欢使用:

    sh
    git push origin branch_name --force-with-lease

    这种方法更安全一些,因为它会在远程分支有你本地不知道的新提交时防止推送。

请注意,更改历史提交,并且强制推送到远程仓库会重写共享的分支历史,这可能会对其他协作者造成影响。在进行这类操作前,最好和你的团队沟通,并确认这是一个可接受的操作。

2024年6月29日 12:07 回复

你的答案