Git - 分支提交历史是重复的

时间:2017-01-15 11:15:42

标签: git github git-filter-branch git-history-graph

我有一个分支,几乎所有提交都有错误的电子邮件"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。真正更改commit auth非常重要,否则将显示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

但我还没试过......我该怎么办?

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

1 个答案:

答案 0 :(得分:1)

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

您使用了来自this questiongit filter-branch,以便在少数提交中更正电子邮件。这成功了,但是你接着采取了以下不正确的行动:

  

然后我做了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分支的历史记录。因此,将分支带到远程的完成步骤始终是强制推送,以重写远程历史记录。

请参阅this SO question了解从您现在的情况中恢复的一些提示,但要意识到只需要强制推送就可以避免这个问题。