Удалить коммиты из ветки в Git - PullRequest
2888 голосов
/ 27 августа 2009

Я хотел бы знать, как удалить коммит.

Под delete я имею в виду, как будто я не делал этот коммит, и когда я делаю push в будущем, мои изменения не будут передаваться в удаленную ветвь.

Я прочитал справку git и думаю, что команда, которую я должен использовать, - git reset --hard HEAD. Это правильно?

Ответы [ 28 ]

3704 голосов
/ 27 августа 2009

Осторожно: git reset --hard УДАЛИТ ВАШИ ИЗМЕНЕНИЯ В РАБОЧЕМ СПРАВОЧНИКЕ . Обязательно сохраните все локальные изменения, которые вы хотите сохранить перед выполнением этой команды.

Если вы сидите на этом коммите, то эта команда его испортит ...

git reset --hard HEAD~1

HEAD~1 означает коммит перед головой.

Или вы можете посмотреть на вывод git log, найти идентификатор коммита коммита, на который вы хотите создать резервную копию, и затем сделать это:

git reset --hard <sha1-commit-id>
<Ч />

Если вы уже толкнули его, вам нужно будет сделать силовой толчок, чтобы избавиться от него ...

git push origin HEAD --force

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

Если вы уже нажали, может быть лучше использовать git revert, чтобы создать коммит "зеркального отображения", который отменит изменения. Тем не менее, обе фиксации будут в журнале.

<ч />

К вашему сведению - git reset --hard HEAD замечательно, если вы хотите избавиться от РАБОТЫ В ПРОГРЕССЕ. Он вернет вас к самой последней фиксации и сотрет все изменения в вашем рабочем дереве и индексе.

<ч />

И наконец, если вам нужно найти коммит, который вы «удалили», он обычно присутствует в git reflog, если вы не удалили мусор в вашем хранилище.

652 голосов
/ 27 августа 2009

Если вы еще нигде не передали коммит, вы можете использовать git rebase -i, чтобы удалить этот коммит. Во-первых, выясните, насколько далеко назад находится этот коммит (приблизительно). Затем выполните:

git rebase -i HEAD~N

~N означает перебазирование последних N коммитов (N должно быть числом, например HEAD~10). Затем вы можете отредактировать файл, который Git представляет вам, чтобы удалить оскорбительный коммит. При сохранении этого файла Git перезапишет все следующие коммиты, как если бы тот, который вы удалили, не существовал.

В Git Book есть хороший раздел о перебазировании с картинками и примерами.

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

457 голосов
/ 27 августа 2009

Еще одна возможность - одна из моих любимых команд:

git rebase -i <commit>~1

Это начнёт перебазирование в интерактивном режиме -i в точке непосредственно перед коммитом, который вы хотите ударить. Редактор запустит список всех коммитов с тех пор. Удалите строку, содержащую коммит, который вы хотите стереть, и сохраните файл. Rebase выполнит остальную часть работы, удалив только этот коммит и воспроизведя все остальные обратно в журнал.

316 голосов
/ 15 октября 2012

Я добавляю этот ответ, потому что не понимаю, почему любой, кто только что попытался зафиксировать работу, захочет удалить всю эту работу из-за какой-то ошибки с помощью Git!

Если вы хотите сохранить свою работу и просто «отменить» эту команду фиксации (которую вы поймали перед тем, как нажать на репо):

git reset --soft HEAD~1

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

76 голосов
/ 31 августа 2015

Удаление всего коммита

git rebase -p --onto SHA^ SHA

Очевидно, замените "SHA" ссылкой, от которой вы хотите избавиться. «^» В этой команде является буквальным.

http://sethrobertson.github.io/GitFixUm/fixup.html

51 голосов
/ 27 августа 2009

Если вы не опубликовали изменения, чтобы удалить последний коммит, вы можете сделать

$ git reset --hard HEAD^

(обратите внимание, что это также удалит все незафиксированные изменения; используйте с осторожностью).

Если вы уже опубликовали коммит для удаления, используйте git revert

$ git revert HEAD
35 голосов
/ 16 октября 2014
git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId относится к тому, который вы хотите вернуть обратно к

31 голосов
/ 16 июня 2017

История принудительного изменения

Предполагая, что вы не просто хотите удалить последний коммит, но хотите удалить определенные коммиты из последних n коммитов, перейдите к:

git rebase -i HEAD~<number of commits to go back>, поэтому git rebase -i HEAD~5, если вы хотите увидеть последние пять коммитов.

Затем в текстовом редакторе замените слово pick на drop рядом с каждым коммитом, который вы хотите удалить. Сохраните и выйдите из редактора. Voila!

История изменений с добавлением

Попробуйте git revert <commit hash>. Revert создаст новый коммит, который отменяет указанный коммит.

29 голосов
/ 31 мая 2014

Если вы хотите исправить свой последний коммит, вы можете отменить коммит и удалить из него файлы, выполнив:

git reset HEAD~1

Это вернет ваш репозиторий в его состояние до того, как команды git add разместили файлы. Ваши изменения будут в вашем рабочем каталоге. HEAD ~ 1 относится к коммиту ниже текущей вершины ветви.

Если вы хотите отменить N коммитов, но сохраните изменения кода в вашем рабочем каталоге:

git reset HEAD~N

Если вы хотите избавиться от своего последнего коммита и не хотите сохранять изменения кода, вы можете выполнить «жесткий» сброс.

git reset --hard HEAD~1

Аналогично, если вы хотите отменить последние N коммитов и не хотите сохранять изменения кода:

git reset --hard HEAD~N
28 голосов
/ 05 сентября 2017

Скажем, мы хотим удалить коммиты 2 и 4 из репо.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Примечание: Вам необходимо иметь права администратора для репо , поскольку вы используете --hard и -f.

  • git checkout b3d92c5 Оформить последний использованный коммит.
  • git checkout -b repair Создайте новую ветку для работы.
  • git cherry-pick 77b9b82 Запустить коммит 3.
  • git cherry-pick 2c6a45b Запустить коммит 1.
  • git checkout master Оформить заказ мастеру.
  • git reset --hard b3d92c5 Сброс мастера до последнего используемого коммита.
  • git merge repair Слияние нашей новой ветки с мастером.
  • git push -f origin master Push master для удаленного репо.
...