Как навсегда удалить несколько коммитов из удаленной ветки - PullRequest
357 голосов
/ 20 июля 2010

Я знаю, что это переписывание истории, и это плохо, яда, яда.

Но как навсегда удалить несколько коммитов из удаленной ветви?

Ответы [ 7 ]

286 голосов
/ 20 июля 2010

Вы 'git reset' - ваша локальная ветвь, а * git push --force - ваша исправленная локальная ветвь для удаленной.( другое решение здесь , включающее удаление удаленной ветви и повторное ее нажатие)

Этот SO ответ иллюстрирует опасность такой команды, особенно если люди зависятв удаленной истории для своих локальных репозиториев.
Вы должны быть готовы указать людям на раздел ВОССТАНОВЛЕНИЕ ОТ UPSTREAM REBASE справочной страницы git rebase man

146 голосов
/ 18 января 2017

Просто обратите внимание на использование last_working_commit_id при возврате нерабочего коммита

git reset --hard <last_working_commit_id>

Таким образом, мы не должны сбросить значение до commit_id, которое нам не нужно.

Тогда обязательно, мы должны нажать на удаленную ветку:

git push --force
133 голосов
/ 17 ноября 2013

Важное замечание: Убедитесь, что вы указали, какие ветви в «git push -f», или вы можете непреднамеренно изменить другие ветви! [*]

В показаны три параметраэтот урок .В случае разрыва ссылки я оставлю здесь основные шаги.

  1. Отменить полный коммит
  2. Удалить последний коммит
  3. Удалить коммит из списка

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
9 голосов
/ 13 марта 2014

Это может быть слишком поздно и слишком поздно, но что мне помогло, так это круто звучащий «ядерный» вариант.В основном с помощью команды filter-branch вы можете удалять файлы или изменять что-либо в большом количестве файлов на протяжении всей вашей истории git.

Лучше всего объяснить здесь .

7 голосов
/ 23 апреля 2015

Упрощение от ответа 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
3 голосов
/ 05 ноября 2016

Иногда самый простой способ решить эту проблему - это создать новую ветку из того места, где вы знаете, что код хорош.Затем вы можете оставить историю ошибочных веток в одиночку на тот случай, если вам понадобится выбрать другие коммиты позже.Это также гарантирует, что вы не потеряли ни одной истории коммитов.

Из вашей локальной ошибочной ветки:

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

Погладить себя по спине.

0 голосов
/ 14 марта 2018
 git reset --soft commit_id
 git stash save "message"
 git reset --hard commit_id
 git stash apply stash stash@{0}
 git push --force
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...