2017-01-15 165 views
1

我有一个分支,几乎所有提交都有错误的电子邮件"[email protected]",我想将该电子邮件更改为我目前的电子邮件"[email protected]"Git - 分支提交历史重复

搜索时,我发现这一点:

git filter-branch --commit-filter 'if [ "$GIT_COMMITTER_EMAIL" = "[email protected]" ]; 
    then 
    export GIT_AUTHOR_NAME="Sandrina Pereira"; 
    export [email protected]; 
    export GIT_COMMITTER_NAME="Sandrina Pereira"; 
    export [email protected]; 
    fi; git commit-tree "[email protected]"' 

See here the difference between COMMITTER and AUTHOR。真正改变commit auth非常重要,否则wit会显示mynewoldnew原始提交下做了提交。在这里我想改变作者和提交者。

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

的问题是,现在你can see here

我搜索如何删除这些提交,我发现这一切我都提交重复:

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

但我没有尝试,但.. 。 我该怎么办?

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

回答

1

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

您从this question开始使用git filter-branch,以纠正少数提交中的电子邮件。这成功了,但是你然后采取了以下不正确的行动:

然后我做了git commit -am“更改作者”,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了解一些提示,以便从现在的状况中恢复过来,但要意识到只要进行推力就可以避免此问题的发生。

+0

谢谢你再次解释我。我不是git的专家,所以这些命令对我来说仍然是一个迷雾。我会仔细阅读这个问题,并尝试解决这个混乱。 –

+0

如果我在这种情况下,我会尽力回到你开始的地方。也许你有另一个非常相似的分支,你可以使用它?只要记住当你完成时强行推动,并且不要从遥控器拉东西;在'filter-branch'之后,你应该将旧的远程版本的分支视为已经死亡。 –

+1

哇,多好的想法,我有另一个分支是的。我会做一个副本,并尝试你所说的话,然后强制合并到主。 –