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. В результате завершающим этапом переноса ветви на удаленный узел всегда является принудительное нажатие, чтобы переписать эту удаленную историю.

Посмотрите этот ТАК вопрос, чтобы получить советы по выходу из ситуации, в которой вы сейчас находитесь, но поймите, что простое принудительное нажатие позволило бы избежать этой проблемы с самого начала.

Другие вопросы по тегам