Я знаю, что это переписывание истории, что плохо, яда, яда.
Но как навсегда удалить несколько коммитов из удаленной ветки?
Я знаю, что это переписывание истории, что плохо, яда, яда.
Но как навсегда удалить несколько коммитов из удаленной ветки?
Ответы:
Вы git reset --hardВаше местное отделение , чтобы удалить изменения из рабочего дерева и индекса, и вы git push --forceисправленное местное отделение на пульт дистанционного управления. ( другое решение здесь , включающее удаление удаленной ветви и повторное ее нажатие)
Этот SO-ответ иллюстрирует опасность такой команды, особенно если люди зависят от удаленной истории для своих локальных репозиториев.
Вы должны быть готовы указывать на людей в разделе « ВОССТАНОВЛЕНИЕ ОТ UPSTREAM REBASE » на git rebaseстранице руководства.
В Git 2.23 (август 2019 года, девять лет спустя) вы будете использовать новую команду git switch.
То есть:
(заменитьgit switch -C mybranch origin/mybranch~nn на количество коммитов для удаления)
Это восстановит индекс и рабочее дерево, как если git reset --hardбы.
push --forceпрочь
git gcне всегда запускается достаточно часто на удаленной стороне. Например, на GitHub: twitter.com/githubhelp/status/387926738161774592?lang=es
Просто обратите внимание, чтобы использовать last_working_commit_id, при отмене нерабочего коммита
git reset --hard <last_working_commit_id>
Поэтому мы не должны возвращаться к commit_id чего мы не хотим.
Тогда обязательно, мы должны нажать на удаленную ветку:
git push --force
git reset --hardдолжен делать.
В этом уроке показаны три варианта . В случае разрыва ссылки я оставлю здесь основные шаги.
1 Отменить полный коммит
git revert dd61ab23
2 Удалить последний коммит
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
или, если филиал доступен локально
git reset HEAD^ --hard
git push <<remote>> -f
где + dd61 ... ваш хеш коммита, а git интерпретирует x ^ как родительский элемент x, а + как принудительный небыстрый push.
3 Удалить коммит из списка
git rebase -i dd61ab23^
Это откроет и редактор, показывающий список всех коммитов. Удалите тот, от которого вы хотите избавиться. Завершите ребаз и подтолкните силу, чтобы сделать репо.
git rebase --continue
git push <remote_repo> <remote_branch> -f
Если вы хотите удалить, например, последние 3коммиты, выполните следующую команду, чтобы удалить изменения из файловой системы (рабочего дерева) и истории коммитов (индекса) в вашей локальной ветке:
git reset --hard HEAD~3
Затем выполните следующую команду (на локальном компьютере), чтобы заставить удаленную ветвь переписать свою историю:
git push --force
Поздравляем! Все сделано!
Некоторые заметки:
Вы можете получить нужный идентификатор фиксации, запустив
git log
После этого вы можете заменить HEAD~Nс <desired-commit-id>следующим образом:
git reset --hard <desired-commit-id>
Если вы хотите сохранить изменения в файловой системе и просто изменить индекс (историю фиксации), используйте --softфлаг вроде git reset --soft HEAD~3. Тогда у вас есть шанс проверить свои последние изменения и сохранить или удалить все или их часть. В последнем случае runnig git statusпоказывает файлы, измененные с тех пор <desired-commit-id>. Если вы используете --hardопцию, git statusвам сообщат, что ваша локальная ветка точно такая же, как и удаленная. Если вы не используете --hardни --soft, используется режим по умолчанию --mixed. В этом режиме git help resetговорит:
Сбрасывает индекс, но не рабочее дерево (т. Е. Измененные файлы сохраняются, но не помечаются для фиксации) и сообщает, что не было обновлено.
Это может быть слишком поздно и слишком поздно, но что мне помогло, так это круто звучащий «ядерный» вариант. В основном с помощью командыfilter-branch вы можете удалять файлы или изменять что-либо в большом количестве файлов на протяжении всей вашей истории git.
Это лучше всего объяснить здесь .
Упрощение от ответа pctroll, аналогично основанному на этом сообщении в блоге .
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
Иногда самый простой способ решить эту проблему - создать новую ветку из того места, где вы знаете, что код хорош. Затем вы можете оставить историю ошибочных веток в одиночку на тот случай, если позже вам понадобится выбрать другие коммиты из нее. Это также гарантирует, что вы не потеряли историю коммитов.
В вашем местном филиале:
git log
скопируйте хеш коммита, в котором вы хотели видеть ветку, и выйдите из журнала git
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
Теперь у вас есть новая ветка именно так, как вы этого хотите.
Если вам также необходимо сохранить конкретный коммит из ветки с ошибками, которой нет в новой ветке, вы можете просто выбрать нужный коммит:
git checkout the_errant_branch
git log
Скопируйте хэш коммита одного коммита, который вам нужен для добавления в хорошую ветку, и выйдите из журнала git.
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
Погладить себя по спине.