我已经在Git中进行了一系列的提交,现在我意识到我忘记正确设置我的用户名和用户电子邮件属性(新机器)。我还没有将这些提交推到我的存储库中,所以在我这样做之前如何纠正这些提交(只有主分支上的3个最新提交)?
我一直在看git reset和git commit -C <id>——reset-author,但我不认为我在正确的轨道上。
我已经在Git中进行了一系列的提交,现在我意识到我忘记正确设置我的用户名和用户电子邮件属性(新机器)。我还没有将这些提交推到我的存储库中,所以在我这样做之前如何纠正这些提交(只有主分支上的3个最新提交)?
我一直在看git reset和git commit -C <id>——reset-author,但我不认为我在正确的轨道上。
当前回答
当与exec结合使用时,交互式rebase方法非常好。您可以针对rebase中的特定提交或所有提交运行任何shell命令。
首先设置git作者设置
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"
其他回答
如果你觉得贬低和修改不安全,你可以这样做。与此同时,你也可以设置全局配置,这可能是你想要做的。
git重置HEAD~(撤销上次提交)
“你的名字”
Git配置——全局用户。电子邮件you@example.com
Git commit -m "message"
当与exec结合使用时,交互式rebase方法非常好。您可以针对rebase中的特定提交或所有提交运行任何shell命令。
首先设置git作者设置
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"
正如回答中建议的那样,任务首选git-filter-repo。
然而,要简单地更改作者名称和/或电子邮件,可以使用——mailmap或——use-mailmap来代替回调。
您需要根据格式创建一个mailmap文件(参见git-filter-repo/docs或git-scm.com/docs)
然后简单地运行
git filter-repo --mailmap .mailmap
这个方法被GitHub记录下来正是为了这个目的(尽管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
复制/粘贴脚本到您的终端,并按enter键运行它。 用git Push——force——tags origin 'refs/heads/*'来推动你的更改,你就完成了!
警告:现在已弃用,支持过滤器-回购。
当你拥有filter-branch的力量时,Rebase/amend似乎效率不高:
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
(为了清晰起见,这不是必须的)
当你完成时,一定要检查结果,以确保你没有改变任何你不想改变的东西!