1

我有一个分支,几乎所有提交都有一个错误的电子邮件"mywrong@email.com",我想将该电子邮件更改为我当前的电子邮件"mynew@email.com"

在搜索时,我发现了这个:

git filter-branch --commit-filter 'if [ "$GIT_COMMITTER_EMAIL" = "mywrong@email.com" ];
  then 
    export GIT_AUTHOR_NAME="Sandrina Pereira";
    export GIT_AUTHOR_EMAIL=mynew@email.com;
    export GIT_COMMITTER_NAME="Sandrina Pereira";
    export GIT_COMMITTER_EMAIL=mynew@email.com;
  fi; git commit-tree "$@"'

请参阅此处 COMMITTER 和 AUTHOR 之间的区别。真正更改提交身份验证很重要,否则机智会显示在原始提交mynew下进行了提交。oldnew在这里,我想更改作者和提交者。

然后我做了git commit -am "change author"git pull并且git push

问题是现在我所有的提交都是重复的,你可以在这里看到

我搜索了如何删除这些提交,我发现了这个:

git filter-branch --commit-filter ' 
  if [ "$GIT_AUTHOR_EMAIL" = "mywrong@email.com" ];
     then skip_commit "$@";
  else git commit-tree "$@"; 
fi' HEAD

但是我还没有尝试...我该怎么办?

下次我想替换电子邮件提交时,避免这种混乱的正确命令是什么?

4

1 回答 1

1

你的问题是其他几个问题的重复,但我会给出一个答案,以便这个问题有一些封闭性。

您使用git filter-branch了 from this question,以更正少数提交的电子邮件。这成功了,但是您随后采取了以下不正确的操作:

然后我做了 git commit -am "change author"、git pull 和 git push。

我认为您不需要提交,但有问题的是git pull. 这会拉入远程分支的替代原始版本,然后将其合并到您的本地分支中。这导致您重写的提交变得重复。这是您在运行后应该立即执行的操作filter-branch

git push --force origin master    # assumes your branch is master; change if needed

这将覆盖远程分支,将其替换为您在本地创建的版本,其中包含更新电子邮件地址。请记住filter-branch,像 一样git rebase,会重写Git 分支的历史。结果,将分支带到远程的最后一步始终是强制推送,以重写该远程历史。

请参阅此 SO 问题,了解一些从您现在所处的情况中恢复过来的技巧,但要意识到,只需进行强制推动就可以避免这个问题。

于 2017-01-15T11:33:15.160 回答