Git - ветвь коммитов истории дублируется
У меня есть ветка, и почти все коммиты имели неправильный адрес электронной почты "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
Но я еще не пробовал... Что мне делать?
И в следующий раз, когда я захочу заменить коммиты по электронной почте, какой командой нужно избегать этого беспорядка?
1 ответ
Ваш вопрос является дубликатом нескольких других вопросов, но я дам ответ, чтобы у этого вопроса было какое-то затруднение.
Ты использовал 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. В результате завершающим этапом переноса ветви на удаленный узел всегда является принудительное нажатие, чтобы переписать эту удаленную историю.
Посмотрите этот ТАК вопрос, чтобы получить советы по выходу из ситуации, в которой вы сейчас находитесь, но поймите, что простое принудительное нажатие позволило бы избежать этой проблемы с самого начала.