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

Mic*_*ech 1949 git git-commit

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

我知道这个问题 - 如何在git中更改提交的作者?

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

Amb*_*ber 3268

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

git commit --amend --author="Author Name <email@address.com>"
Run Code Online (Sandbox Code Playgroud)

例如,如果你的提交历史是A-B-C-D-E-FF作为HEAD的,你想改变的作者CD,然后你会......

  1. 指定git rebase -i B(这是执行git rebase -i B命令后将看到的示例)
    • 如果你需要编辑A,请使用git rebase -i --root
  2. 更改两者CD从的pickedit
  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将完成.
  10. 用于使用git push -f更新的提交更新您的来源.

  • 使用`--no-edit`选项.`git commit --amend --reset-author --no-edit`不会打开编辑器.自git 1.7.9起可用. (188认同)
  • 很好的答案,但对于初学者:首先在你想改变的那个之前找到一个提交,然后运行`git rebase -i <commit>` (81认同)
  • @Brenden修改项目中的第一个提交,使用`git rebase -i --root` (46认同)
  • 如果你不知道你在哪个编辑器,答案很可能是"vim".要保存并退出,请键入Esc:wq Enter.另一方面,如果是Nano,你会在底部看到"WriteOut:^ O"之类的东西,那么你应该使用Ctrl + O,Enter,Ctrl + X代替. (38认同)
  • 如果你想修改第一次提交怎么办?之前的提交哈希是什么? (26认同)
  • 请注意,您可以使用`git commit --amend --reset-author`将提交作者设置为当前用户 (9认同)
  • @Mathew Byrne或指定a1b3c3d4 ^来引用前面的提交. (5认同)
  • 使用命令`git push -f remote branch-name`完成rebase后,你必须强制推送到git,以便将更改应用到远程. (5认同)
  • 按照所有这些步骤后,我必须运行```git push -f``` (5认同)
  • 这里有一点需要注意:重新定位会缩小合并历史记录,这会导致历史记录显着改变,甚至在重新定位时也会出现困难的合并冲突.要使git不这样做,请将`-p`选项添加到`git rebase`. (4认同)
  • @dma_k `a1b3c3d4^` 部分将用于 rebase 命令 - 例如 `git rebase -i a1b3c3d4^`。 (2认同)
  • 我将这条线从拾取更改为编辑,但如何继续...我在文本编辑器中,但我不知道在更改线后如何继续... (2认同)
  • 添加`--reuse-message = HEAD`标志以避免编辑每个提交消息 (2认同)
  • 我到底需要做一次推力? (2认同)
  • @ user593644如果你已经在rebase之前推了,是的. (2认同)
  • 你太棒了!节省了我的时间.谢谢.那些不知道编辑界面的人,按下"插入"打开屏幕上的编辑模式,而git bash提出你的提交列表.然后,按照步骤2中的建议进行更改.完成后,按"Esc"进入完全编辑模式,然后按":wq"+"Enter"保存并继续下一步. (2认同)
  • 请注意,这也会更改您的提交日期,这通常是一种不良影响。 (2认同)
  • 添加`-C @`,例如`git commit --amend --author ="作者姓名<email@address.com> -C @`将为您节省一些步骤.这将自动重用提交消息,编辑器不会一切都开放. (2认同)
  • 如果你确实更改了 git 配置(使用 `git config --global user.name "Developer Display Name"` 和 `git config --global user.email "Developer Email Address"`),那么 `git commit --amend --author="作者姓名 &lt;email@address.com&gt;"` 可以缩写为 `git commit --amend --reset-author` (2认同)

mer*_*011 453

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

因为我担心运行依赖于设置和取消设置环境变量的脚本来重写git历史记录,所以我根据这篇文章写了一个新的答案,这个答案这个答案类似,但是更完整.

与链接的答案不同,以下内容经过测试和运行.为了清楚说明,03f482d6我们正在尝试替换作者的提交,并且42627abe是新作者的提交.

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

    git checkout 03f482d6
    
    Run Code Online (Sandbox Code Playgroud)
  2. 让作者改变.

    git commit --amend --author "New Author Name <New Author Email>"
    
    Run Code Online (Sandbox Code Playgroud)

    现在我们有一个假定为hash的新提交42627abe.

  3. 签出原始分支.

  4. 在本地替换旧的提交.

    git replace 03f482d6 42627abe
    
    Run Code Online (Sandbox Code Playgroud)
  5. 根据替换重写所有未来的提交.

    git filter-branch -- --all
    
    Run Code Online (Sandbox Code Playgroud)
  6. 取下更换清洁度.

    git replace -d 03f482d6
    
    Run Code Online (Sandbox Code Playgroud)
  7. 推送新历史记录(如果以下操作失败,则仅使用--force,并且仅在使用git log和/或进行完整性检查后git diff).

    git push --force-with-lease
    
    Run Code Online (Sandbox Code Playgroud)

而不是4-6,你可以改变到新的提交:

git rebase -i 42627abe
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很明显替代了可怕的`git rebase -i`.从来没有听说过这个'git replace`的事情.+1 (37认同)
  • 请在第2步之后在那里放一张纸条重新检查您的原始分支. (9认同)
  • 警告:请注意`git filter-branch - --all`正在更改原始提交所在的所有分支中的提交.如果您没有足够的凭据(或者您只是不想更改其他分支历史记录) ),小心这个答案是好的. (5认同)
  • 我建议使用`--force-with-lease`而不是`-f`.它更安全. (4认同)
  • 要清理refs/original/... backup,请参见[here](http://stackoverflow.com/a/7654880/1342186) (3认同)
  • 知道如何保留提交日期吗?现在它比它上面的提交更新 (3认同)
  • 这个答案只是针对那些有着可怕的 git 历史的人的解决方法,其中包括 rebase/merge/rebase/merge 循环,直到整个事情不再是可 rebase 的(或就此而言可读)。“git rebase -i”对于其他人来说是*正确的方法。尽管如此,这是一个很好的解决方法。 (2认同)
  • @TudorCarean,我认为有一个 [单独的问题](http://stackoverflow.com/questions/454734/how-can-one-change-the-timestamp-of-an-old-commit-in-git) ,我想这些解决方案之一可以与这个解决方案结合起来。 (2认同)
  • @ merlin2011,谢谢你的精彩帖子.我实际上已经尝试了它并且它工作得很好,但是有一个很小的改变:在`步骤5`中的`git replace -d`之后,似乎需要一个`git checkout master`命令.否则我仍然在一个未命名的分支上,`git push`在那里不起作用.你对此有何看法? (2认同)
  • @merlin2011 哦,不,我不知道它们是否改变了。我中止了手术。我不明白为什么在最后一天更改提交需要返回到时间的开始并从零开始向前搜索。 (2认同)

oli*_*666 203

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

#!/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
Run Code Online (Sandbox Code Playgroud)

  • 这会在所有提交中更改它,而不仅仅是一个.有趣的是,我在不到30分钟前做到了这一点. (11认同)
  • git push -f完成魔术。感谢这颗珍珠! (3认同)
  • 注意,如果你避免使用`clone` /`push`,你最终会得到一个备份命名空间`refs/original /`.我找不到一种方法来智能地删除这个命名空间,所以我最终删除了目录`.git/refs/original`,这有效. (2认同)

pra*_*tle 138

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

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

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

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

  • 要修复我的最后六次提交:首先使用 `git config --local user.name FirstName LastName` 和 `git config --local user.email first.last@example.com` 设置当前 Git 存储库的正确作者。然后使用 `git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6` 应用于最后六个提交。最后使用“git push --force-with-lease”将其推送到远程 Git 存储库。 (13认同)
  • @oHo 我希望这是一个答案,这样我就可以投票。这是唯一为我解决问题的方法,这对我来说是巨大的痛苦。 (3认同)
  • 不,这不对。看看 OP:`这不是最后一次提交。` 那么他们将如何`修改`它? (2认同)
  • 太好了,可惜这只是最后一次提交。幸运的是,我在最近的两次上都需要它,所以只做了一个git reset HEAD〜,运行了建议的行,然后再次手动进行了下一次提交。工作正常! (2认同)
  • 谢谢!--reset-author为我完成了窍门,因为没有它,作者会更改,但“提交者”将保留旧的作者详细信息。 (2认同)
  • 同意 @oHo 示例有效,很简单,并且可以让您控制要更改的提交历史记录的早前程度。 (2认同)
  • @oHo 这应该是最好的答案,简单又容易! (2认同)

Fat*_*cet 78

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

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 .


oli*_*bre 77

修复最近六次提交的创作

  1. 首先为当前 Git 存储库设置正确的作者

    git config --local user.name "FirstName LastName"
    git config --local user.email first.last@example.com
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后将修复应用于最后六次提交

    git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后强制推送到远程Git仓库

    git push --force-with-lease
    
    Run Code Online (Sandbox Code Playgroud)

  • 另请注意,这将重写提交,这意味着它也会更改提交时间。发生这种情况是因为我最初运行命令时并不知道。如果不关心时间戳,这是一种甜蜜而简单的方法。:) (2认同)

Chr*_*sen 55

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

作为尝试的借口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
Run Code Online (Sandbox Code Playgroud)

  • Github文档包含[类似脚本](https://help.github.com/articles/changing-author-info) (11认同)
  • @ olivieradam666就像一个魅力,它更容易阅读 (2认同)

Eug*_*kov 35

提交之前:

在此输入图像描述

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

git commit --amend --author="Author Name <email@address.com>"
Run Code Online (Sandbox Code Playgroud)

或者重复使用您的姓名和电子邮件,您可以写:

git commit --amend --author=Eugen
Run Code Online (Sandbox Code Playgroud)

命令后提交:

在此输入图像描述

例如,从4025621以下各项开始更改全部:

在此输入图像描述

你必须运行:

git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621
Run Code Online (Sandbox Code Playgroud)

注意:要包含包含名称和电子邮件地址等空格的作者,作者必须被转义引号括起来.例如:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621
Run Code Online (Sandbox Code Playgroud)

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

[alias]
    reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --
Run Code Online (Sandbox Code Playgroud)

然后运行:

git reauthor 4025621 Eugen
Run Code Online (Sandbox Code Playgroud)

  • 这是最符合我的目的的答案,谢谢。而且由于我只是想调整*我*的电子邮件地址,因此在更新.git / config后,可以使用--exec =“ git commit --amend --reset-author”运行。 (3认同)
  • 这对我没有帮助。现在我有 **Continue Rebase Failed** 错误 (2认同)

NOZ*_*IGH 25

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

简单明了的方法:

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
Run Code Online (Sandbox Code Playgroud)

详细操作

  • 显示提交日志并找出您要更改的提交之前的提交 ID:
git log
Run Code Online (Sandbox Code Playgroud)
  • 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
Run Code Online (Sandbox Code Playgroud)
  • 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
Run Code Online (Sandbox Code Playgroud)
  • 确认并继续你的变基,直到它成功 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.
Run Code Online (Sandbox Code Playgroud)
  • git push 更新
git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)


小智 15

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

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

要小心,没有很多人在同一个分支上工作,因为它会破坏一致性.


dno*_*zay 14

在做什么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"
  • 创建空提交(每次提交一次):
    • 你需要一个用于rebase目的的消息
    • git commit --allow-empty -m "empty"
  • 启动rebase操作
    • git rebase -i B^
    • B^选择父母B.
  • 您需要每次提交之前进行一次空提交以进行修改
  • 你将要改变picksquash这些.

什么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
Run Code Online (Sandbox Code Playgroud)

改为:

# 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
Run Code Online (Sandbox Code Playgroud)

它会提示您编辑消息:

# 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...
Run Code Online (Sandbox Code Playgroud)

你可以删除前几行.


mar*_*icn 13

解决方案

  1. 安装(Git项目推荐以上git filter-repo filter-repofilter-branch

    $ PACKAGE_TOOL install git-filter-repo
    
    Run Code Online (Sandbox Code Playgroud)
  2. .mailmap在 git 存储库的根目录中创建一个文件,其中包含

    New Name <new@ema.il> <old@ema.il>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 跑步git filter-repo --use-mailmap


更多细节

  • git-filter-repo在他们的文档中将此作为示例列出
  • 不要像上面的示例那样同时替换名称和电子邮件,而是查看git mailmap 文档中的其他示例
  • .mailmap您可以通过使用参数调用来指定邮件映射文件,而不是使用git filter-repo默认命名的文件--mailmap <filename>
  • 有关如何进一步过滤分支/标签/任何内容的更多示例可以在git-filter-repo 项目的 README.md中找到。


kor*_*kiy 11

为了促进Eugen Konkov的响应,从根提交开始,使用--rootflag。该--no-edit标志也很有帮助

git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
Run Code Online (Sandbox Code Playgroud)


Cha*_*naB 9

如果您要更改的提交不是最后一次提交,请按照以下步骤操作。如果您的提交位于不同的分支,则首先切换到该分支。

git checkout 分支名称

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

git rebase -i -p 提交哈希

然后编辑器将打开并为您要更改的提交输入“编辑”。让其他人使用默认的“选择”选项。更改后输入'esc'键和wq!退出。

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

git commit --amend --author="用户名电子邮件" --no-edit

然后发出以下命令。

git rebase --continue

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


小智 9

使用交互式变基

git rebase -i -p <some HEAD before all of your bad commits>
Run Code Online (Sandbox Code Playgroud)

然后在 rebase 文件中将所有错误提交标记为“编辑”,当 Git 要求您修改每个提交时,执行以下操作

git commit --amend --author "New Author Name <email@address.com>"
Run Code Online (Sandbox Code Playgroud)

编辑或关闭打开的编辑器,然后执行

git rebase --continue
Run Code Online (Sandbox Code Playgroud)

继续变基。

您可以通过附加来跳过在此处完全打开编辑器,--no-edit以便命令为:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Run Code Online (Sandbox Code Playgroud)

单次提交

正如一些评论者所指出的,如果您只想更改最近的提交,则不需要rebase命令。做就是了

git commit --amend --author "New Author Name <email@address.com>"
Run Code Online (Sandbox Code Playgroud)

这会将作者更改为指定的名称,但提交者将设置为您在 git config user.name 和 git config user.email 中配置的用户。如果您想将提交者设置为您指定的内容,这将同时设置作者和提交者:

git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Run Code Online (Sandbox Code Playgroud)


Jas*_*Liu 8

对于合并提交消息,我发现我无法使用 来修改它rebase,至少在 gitlab 上是这样。它显示合并为提交,但我无法重新定位到该#sha。我发现这篇文章很有帮助。

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*cki 8

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

git config user.name "Author Name"
git config user.email "<email@address.com>"
Run Code Online (Sandbox Code Playgroud)

为什么不按照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在两者之间确定自己所处的位置。


bue*_*rgi 7

作为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
Run Code Online (Sandbox Code Playgroud)

然后用力推

git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)


Kir*_* A. 6

提交推送后重命名作者姓名的步骤

  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:BRANCH NAME -f [请注意 -f 强制推送]

    喜欢 git push -fgit push origin HEAD: dev -f


COR*_*ian 6

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

$ git status
$ git stash
Run Code Online (Sandbox Code Playgroud)

更新最后一次提交的作者。

$ 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
Run Code Online (Sandbox Code Playgroud)

然后,如果您使用git stashthen 恢复您的分阶段更改

$ git stash pop
$ git status
Run Code Online (Sandbox Code Playgroud)

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

$ git config user.name "Author Name"
$ git config user.email "<email@address.com>"
Run Code Online (Sandbox Code Playgroud)

并检查或编辑它 git config --edit


澄清:在极少数情况下,您丢失了提交,$ ggpush -f您可以使用reflog恢复它们。无论如何,使用--force-with-lease您比仅使用时受到的保护更多-f

GL

  • 否决是因为如果有一种方法可以在不使用 git Push -f 的情况下执行某些操作,那么就可以在不使用 git Push -f 的情况下执行此操作。 (2认同)

end*_*ama 6

有一个适用于投票最多的问题的快捷方式:使用exec代替edit

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

步骤是:

  1. 执行变基到较早的提交 ( git rebase -i <earliercommit>)
  2. 在打开的编辑器中,在要编辑和添加的每个提交行后添加一行exec git commit --amend --author="Author Name <email@address.com>" --no-edit--reset-author如果要重置为 git 配置中设置的值,则使用)
  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.
#
Run Code Online (Sandbox Code Playgroud)


Mud*_*han 5

您可以从 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
Run Code Online (Sandbox Code Playgroud)

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


V.E*_*E.O 5

有一件重要的事情需要提及,特别是如果您出于隐私原因删除作者信息。

根据前面的答案进行操作后:

git commit --amend --author="Author Name <email@address.com>"
git push -f
Run Code Online (Sandbox Code Playgroud)

具有旧作者信息的提交仍然存在于 Git 本地和远程缓存中

作为 GitHub,您仍然可以通过SHA-1访问提交,并带有警告“此提交不属于此存储库上的任何分支,并且可能属于存储库外部的分支。”

垃圾收集可以在本地存储库中执行:

git gc
Run Code Online (Sandbox Code Playgroud)

但是,对于 GitHub,您无法触发此命令,请转至支持我们如何帮助您从您拥有的存储库中删除数据?,并Clear Cached Views在您的存储库上提交票证。

最后一步适用于所有提交修改/删除操作。

参考:从 GitHub 中完全删除数据

警告:本文告诉您如何从 GitHub.com 上的存储库中的任何分支或标签中提交敏感数据。但是,这些提交仍然可以在存储库的任何克隆或分支中直接通过 GitHub 上缓存视图中的 SHA-1 哈希值以及引用它们的任何拉取请求进行访问。您无法从其他用户的存储库克隆中删除敏感数据,但您可以通过联系 GitHub 支持来永久删除 GitHub 上拉取请求中的缓存视图和敏感数据引用。


归档时间:

查看次数:

861945 次

最近记录:

5 年,11 月 前