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

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

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

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

Ответы [ 28 ]

18 голосов
/ 19 мая 2016
git rebase -i HEAD~2

Здесь «2» - это количество коммитов, которые вы хотите перебазировать.

'git rebase -i HEAD`

, если вы хотите отменить все коммиты.

Тогда вы сможете выбрать один из этих вариантов.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

Эти строки можно переупорядочить; они выполняются сверху вниз. Если вы удалите строку здесь, то этот коммит будет потерян. Однако, если вы удалите все, ребаз будет прерван. Обратите внимание, что пустые коммиты закомментированы

Вы можете просто удалить этот коммит, используя опцию "d" или Удалить строку, содержащую ваш коммит.

15 голосов
/ 28 августа 2014

Чтобы удалить в локальной ветке, используйте

git reset --hard HEAD~1

Чтобы удалить в удаленной ветке, используйте

git push origin HEAD --force
9 голосов
/ 13 мая 2013

Вот еще один способ сделать это:

Извлеките ветку, которую вы хотите вернуть, а затем сбросьте локальную рабочую копию на коммит, который вы хотите, чтобы он был последним на удаленном сервере (все после того, как оно уйдет, пока Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал «Сбросить BRANCHNAME для этого коммита». Я думаю, что командная строка:

git reset --hard COMMIT_ID

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

Затем перейдите в локальный каталог вашего репозитория и выполните команду:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Это удалит все коммиты после текущего в вашем локальном репозитории, но только для этой одной ветки.

9 голосов
/ 25 мая 2016

Ошибка:

Я git rebase -i --root редактировал свою ветку, не зная, что могу перефразировать первый коммит, отличный от основного ( GitHub для Windows представление по умолчанию - это сравнение с мастером, полностью скрывающее его).

Я отрастил бороду в Силиконовой долине, а 900+ коммитов погрузились в Sublime. Выйдя без изменений, я зарядил батарею, а затем приступил к бритью, так как все 900+ отдельных коммитов небрежно перебазированы - сбрасывая время их фиксации до настоящего времени.

Решив побить Git и сохранить первоначальное время, я удалил этот локальный репозиторий и повторно клонировал с пульта.

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

Исчерпывающие возможности:

Я не хотел бы git revert - это создаст дополнительный коммит, который даст Git преимущество.

git reset --hard HEAD ничего не сделал, после проверки reflog последний и единственный HEAD был клоном - Git выигрывает.

Чтобы получить самый последний SHA, я проверил удаленный репозиторий на github.com - незначительный выигрыш.

Подумав, git reset --hard <SHA> сработало, я обновил другую ветку до master и 1 ... 2 ... poof! коммит вернулся - Гит побеждает.

Возвращаясь к мастеру, попробуйте git rebase -i <SHA>, затем удалите строку ... безрезультатно, к сожалению. Msgstr " Если вы удалите строку, ЭТОТ КОМИТЕТ БУДЕТ ПОТЕРЯН ". Ах ... вкратце о новой функции troll n00b в примечаниях к выпуску 2.8.3 .

Решение:

git rebase -i <SHA>, затем d, drop = remove commit.

Для проверки я выехал в другую ветку, и вуаля - нет скрытого коммита для извлечения / извлечения из мастера.

https://twitter.com/holman/status/706006896273063936

Добрый день.

8 голосов
/ 04 октября 2012

Все вышеперечисленные команды восстанавливают состояние вашего рабочего дерева и индекса, как они были до выполнения коммита, но не восстанавливают состояние репозитория. Если вы посмотрите на него, «удаленный» коммит на самом деле не удаляется, он просто не тот, что на кончике текущей ветви.

Я думаю, что нет способа удалить коммит с помощью фарфоровых команд . Единственный способ - удалить его из журнала и reflog, а затем выполнить git prune --expire -now.

7 голосов
/ 27 мая 2014

Если вы только что испортили свой последний коммит (неправильное сообщение, забыли добавить некоторые изменения) и хотите исправить его, прежде чем отправлять в публичный репозиторий, почему бы не использовать:

git commit --amend -m "New message here"

Если у вас есть новые изменения, они будут объединены с последним коммитом (от которого вы пытаетесь избавиться) и заменит этот коммит.

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

Вы также можете передать опцию '--no-edit' вместо '-m', если вы предпочитаете использовать сообщение предыдущего коммита.

Документы: http://git -scm.com / документы / ГИТ-commit.html

7 голосов
/ 07 января 2015

Если вы хотите сохранить историю, показывая фиксацию и возврат, вы должны использовать:

git revert GIT_COMMIT_HASH

введите сообщение, объясняющее, почему вы возвращаетесь, а затем:

git push  

Когда вы выполните команду git log, вы увидите как «неправильный» коммит, так и возврат сообщений журнала.

6 голосов
/ 22 июня 2018

Источник: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

Удалить последний коммит

Например, ваш последний коммит

git push origin + aa61ab32 ^: master

Теперь вы хотите удалить этот коммит, а затем Простой способ сделать следующее

Шаги

  1. Сначала сбросьте ветвь для родителя текущего коммита

  2. Принудительно протолкните его на пульт.

git reset HEAD^ --hard

git push origin -f

Для конкретного коммита, который вы хотите сбросить, следует

git reset bb676878^ --hard

git push origin -f
5 голосов
/ 14 июня 2017

То, что я обычно делаю, когда я фиксирую и нажимаю (если кто-то толкнул его, это решит проблему):

git reset --hard HEAD~1

git push -f origin

надеюсь, что это поможет

5 голосов
/ 30 января 2017

Если вы уже нажали, сначала найдите коммит, которым вы хотите быть, в HEAD ($ GIT_COMMIT_HASH_HERE) , затем выполните следующее:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Затем каждое место, где был клонирован репо, запускайте:

git reset --hard origin/master
...