Git - 分支提交历史重复

Git - branch commits history are duplicated

我有一个分支,几乎所有提交都有一个错误的电子邮件 "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 "$@"'

See here the difference between COMMITTER and AUTHOR。真正更改提交身份验证很重要,否则机智将显示 mynewoldnew 原始提交下进行了提交。在这里我想同时更改作者和提交者。

然后我做了 git commit -am "change author"git pullgit push

问题是现在我所有的提交都和你一样重复了can see here

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

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

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

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

你的问题与其他几个问题重复,但我会给出一个答案,让这个问题有一些解释。

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

Then I did git commit -am "change author", git pull and git push.

我认为您不需要提交,但有问题的是 git pull。这拉取了远程分支的备用原始版本,然后将其合并到您的本地分支中。这导致您重写的提交变得重复。这是您应该在 运行 filter-branch:

之后立即执行的操作
git push --force origin master    # assumes your branch is master; change if needed

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

请参阅 this SO question 了解一些从您现在所处的情况中恢复过来的技巧,但请注意,只要用力推动就可以避免这个问题。