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。真正更改提交身份验证很重要,否则机智将显示 mynew
在 oldnew
原始提交下进行了提交。在这里我想同时更改作者和提交者。
然后我做了 git commit -am "change author"
、git pull
和 git 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-branch
与 git rebase
一样, 重写了 Git 分支的历史。因此,将分支带到远程的最后一步总是强制推送,以重写该远程历史。
请参阅 this SO question 了解一些从您现在所处的情况中恢复过来的技巧,但请注意,只要用力推动就可以避免这个问题。
我有一个分支,几乎所有提交都有一个错误的电子邮件 "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。真正更改提交身份验证很重要,否则机智将显示 mynew
在 oldnew
原始提交下进行了提交。在这里我想同时更改作者和提交者。
然后我做了 git commit -am "change author"
、git pull
和 git 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-branch
与 git rebase
一样, 重写了 Git 分支的历史。因此,将分支带到远程的最后一步总是强制推送,以重写该远程历史。
请参阅 this SO question 了解一些从您现在所处的情况中恢复过来的技巧,但请注意,只要用力推动就可以避免这个问题。