我在Git中进行了一系列提交,现在我意识到我忘记正确设置用户名和用户电子邮件属性(新机器)了。我尚未将这些提交推送到我的存储库中,因此如何在我这样做之前更正这些提交(仅master分支上的3个最新提交)?
我一直在查看git reset
和git commit -C <id> --reset-author
,但我认为自己的方向不正确。
我在Git中进行了一系列提交,现在我意识到我忘记正确设置用户名和用户电子邮件属性(新机器)了。我尚未将这些提交推送到我的存储库中,因此如何在我这样做之前更正这些提交(仅master分支上的3个最新提交)?
我一直在查看git reset
和git commit -C <id> --reset-author
,但我认为自己的方向不正确。
Answers:
当您触手可及的分支过滤功能时,重新设置/修改似乎效率很低:
git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
GIT_AUTHOR_EMAIL=correct@email;
GIT_AUTHOR_NAME="Correct Name";
GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all
(为了清楚起见,将它们分成几行,但这不是必需的)
完成后,请务必检查结果,以确保您没有做任何不必要的更改!
git filter-branch --help
非常简单:)
--tag-name-filter cat
了filter-branch
以便将标签迁移到新历史记录。它还使用--branches --tags
代替--all
,它仅重写分支和标签的历史记录,并保留其他历史记录refs
(尽管除非您正在使用,否则可能不会有太大的不同git-notes
)
-- --all
为HEAD~1..HEAD
git log HEAD~2..HEAD
?
与exec结合使用时,交互式变基方法非常好。您可以针对特定提交或对rebase中的所有提交运行任何shell命令。
首先设置您的git author设置
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
然后在给定的SHA之后重置所有提交的提交者
git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"
这将弹出您的编辑器以确认更改。您需要做的就是保存并退出,它将通过每次提交并运行-x标志中指定的命令。
根据以下@Dave的评论,您还可以通过以下方式更改作者,同时保持原始时间戳:
git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
filter-branch
只想修复最后的提交要简单得多:)。但是请注意,这会更改提交的时间戳。
git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
git log
也向我显示了旧的作者身份,但是git status正确地标识了新的提交,并且在强制推送之后它们符合我的意图。
git rebase -i --root …
而不是传递SHA。
要仅针对最后一次提交更改作者:
git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
假设您只想更改最近N次提交的作者:
git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"
笔记
--no-edit
标志可以确保git commit --amend
不要求额外的确认git rebase -i
,您可以手动选择更改作者的提交,您编辑的文件将如下所示:
pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix
--rebase-merges
(short -r
)选项,以在分支包含某些合并的情况下保持分支的拓扑完整。
github为此目的记录了这种方法。这些步骤是:
git clone --bare https://github.com/user/repo.git
cd repo
OLD_EMAIL
,CORRECT_EMAIL
和CORRECT_NAME
)#!/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 push --force --tags origin 'refs/heads/*'
您就完成了!我相信你在找什么 git rebase --interactive
它允许您重置为特定的提交,然后抛出更改添加或分组提交的历史记录
remote: error: GH007: Your push would publish a private email address.
...`![远程拒绝]管理员->管理员(由于电子邮件隐私限制,推送被拒绝)。