如何在Git中修改几个提交来改变作者

我在Git中做了一系列的提交,现在我意识到我忘了正确设置我的用户名和用户邮件属性(新机器)。 我还没有推送这些提交到我的存储库,所以我怎么才能纠正这些提交之前,我这样做(只有3最新提交的主分支)?

我一直在寻找git resetgit commit -C <id> --reset-author ,但我不认为我在正确的轨道上。

当你拥有过滤分支的力量时,重新编译/修改似乎效率低下:

 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 

(为了清晰起见跨线分开,但不是必需的)

当你完成后,一定要检查结果,以确保你没有改变任何你不想要的!

当与exec结合使用时,交互式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" 

这将popup你的编辑器来确认更改。 所有你需要做的是保存并退出,它将通过每个提交并运行在-x标志中指定的命令。

Per @ Dave的下面的评论,你也可以改变作者,同时保留原始的时间戳:

 git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD" 

要仅更改上次提交的作者:

 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 ,你可以手动select提交作者的地方,

您编辑的文件将如下所示:

 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 

我相信你正在寻找的是git rebase --interactive

它允许你重置到一个特定的提交,然后抛出历史更改添加或分组提交

这里你有一个解释http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive

如果你对贬低和修改感到不安全,你可以这样做。 同时你也可以设置你可能打算做的全局configuration。

git reset HEAD~ (撤消上次提交)

git config --global user.name "Your Name"

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

git commit -m "message"