Я видел это несколько раз, но нет никаких твердых ответов о том, как это решить.
Я пошел и запустил это в своей ветке, чтобы переписать историю авторов:
git filter-branch --env-filter '
OLD_EMAIL = "[email protected]"
CORRECT_NAME = "Your Correct Name"
CORRECT_EMAIL = "[email protected]"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME = "$CORRECT_NAME"
export GIT_COMMITTER_EMAIL = "$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME = "$CORRECT_NAME"
export GIT_AUTHOR_EMAIL = "$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
Затем я выпустил git push --force --tags origin 'refs/heads/*' и подумал, что все прошло хорошо. Пока я не открыл SourceTree и не увидел, что мне нужно вытащить кучу коммитов, я вытащил, а затем нажал, не задумываясь. Вероятно, он сделал еще одно нажатие без --force, и теперь почти все фиксации дублируются.
Я попытался выполнить перебазирование в интерактивном режиме с помощью rebase -i HEAD~, но он упорядочивает коммиты на основе истории предков (или чего-то подобного), что делает практически невозможным раздавить повторяющиеся коммиты, которых на мастере сотни.
Есть ли способ исправить это ответственным образом?
Я не понимаю, что именно произошло, но я знаю, что у меня была последняя копия мастера до того, как я выполнил операцию, и никакие другие пользователи не отправляли изменения в ветку. На самом деле вопрос в том, что с этим делать на данном этапе. Интересно отметить, что rebase -i HEAD также просто возвращает noop.
Я частично беру то, что сказал. Причина, по которой Git сказал, что вы находитесь за удаленной веткой является, потому что вы переписали историю этой ветки. Но вам обязательно нужно нет сделать git pull ... это была большая ошибка. Я не знаю, как это исправить; На вашем месте я бы просто вернулся и начал все сначала.
действительно большая ошибка.
Вы могли бы просто удалить коммиты, которые были сделаны, когда вы делали git pull. Это предполагает, что вы использовали стратегию слияния, а не стратегию перебазирования.
Ветвь фильтра не выполняет (потому что не может) изменять фиксируется, поэтому по существу фиксируется копия должен. Если вы повторно представите исходные коммиты из исходного репозитория или любого из его клонов, вы увидите именно такое поведение. По сути, после фильтрации все существующие клоны отфильтрованного репозитория должны быть навсегда исключены. Тем не менее, обычно вы можете просто сбросить слияние, а затем возобновить исключение. :-)
Я попытался использовать rebase -i <commit> и удалить все повторяющиеся коммиты по сообщению (их было много), но в итоге отказался от попытки, поскольку что-то пошло не так. В конце произошел конфликт, и несколько файлов были изменены - я предполагаю, что я удалил коммит слияния с тем же сообщением или чем-то еще. Здесь нет простых ответов.





and saw I had a bunch of commits to pull... похоже, что, возможно, другие все еще добавляли что-то в эту удаленную ветку, пока вы выполняли ветку с фильтром. Либо так, либо вы неправильноgit pullперед запуском ветви фильтра. В любом случае, вы не должны были делать это тянуть. По сути, поскольку вы переписали историю ветки, принудительное нажатие - единственное, что вы могли сделать на этом этапе.