在一个特定的提交更改提交作者
我想改变历史中某个特定提交的作者。 这不是最后的提交。
我知道这个问题 – 我如何改变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
,并且您想要更改C
和D
的作者,那么您将…
- 指定
git rebase -i B
(注意:如果是A
,则需要编辑,使用git rebase -i --root
) - 更改
C
和D
的行以进行edit
- 一旦开始了rebase,它会先在
C
停下来 - 你会
git commit --amend --author="Author Name <email@address.com>"
- 然后
git rebase --continue
- 它会在
D
再次停顿 - 然后你会再次
git commit --amend --author="Author Name <email@address.com>"
-
git rebase --continue
- 基地将完成。
这个问题被接受的答案是巧妙地使用了交互式的rebase,但是不幸的是,如果我们试图改变原来的作者在后来合并的一个分支上的提交,那么它就会performance出冲突。更普遍的说,它不起作用处理凌乱的历史。
由于我担心运行的脚本依赖于设置和取消设置环境variables来重写git历史logging,我正在写一个基于这个post的新答案, 这个答案类似于这个答案,但是更完整。
以下是testing和工作,不像链接的答案。 假设为了清楚地说明03f482d6
是我们试图replace的作者, 42627abe
是新作者的承诺。
-
检出我们试图修改的提交。
git checkout 03f482d6
-
让作者改变。
git commit --amend --author "New Author Name <New Author Email>"
然后检查原来的分支。
-
在本地replace旧的提交。
git replace 03f482d6 42627abe
-
根据replace重写所有将来的提交。
git filter-branch -- --all
-
取下更换的清洁。
git replace -d 03f482d6
-
推新的历史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
开始重新绑定。 它会告诉你这样的事情。
更改pick
关键字以edit
您想要更改作者姓名的提交。
然后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, - 你想改变提交
B
和D
(= 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...
你可以删除前几行。