Удалить git commit, который не был передан

724

Я сделал, git commitно я еще не отправил его в хранилище. Поэтому, когда я это делаю git status, я получаю '# Ваша ветка опережает' master 'на 1 коммит.

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

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

учитывая, что когда я делаю, git logя получаю:

commit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Дата: вторник, 29 сентября 11:21:41 2009 -0700


commit db0c078d5286b837532ff5e276dcf91885df2296
Дата: вторник, 22 сентября 10:31:37 2009 -0700
hap497
источник
9
Этот вопрос, кажется, является дубликатом другого вашего собственного вопроса: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Брайан Кэмпбелл
1
Возможный дубликат
Леонардо Алвес Мачадо
1
Возможный дубликат Как отменить последние коммиты в Git?
Ян Зеребецкий
3
ОПАСНОСТЬ: reset --hardможет привести к потере работы, потому что это приводит к тому, что git перезаписывает ваши локальные файлы (вашу новую работу) на файлы из Интернета (случилось со мной). В вопросах и ответах по поводу git должно быть четко указано, что делают их команды, и каковы риски для читателей.
OrangeSherbet

Ответы:

673

На самом деле, когда вы используете git reset, вы должны ссылаться на коммит, который вы сбрасываете к ; так что db0c078, возможно, вы захотите совершить коммит.

Более простой версией было бы git reset --hard HEAD^восстановление предыдущего коммита перед текущей головой; Таким образом, вам не нужно копировать идентификаторы коммитов.

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

Кроме того, вместо HEAD вы можете использовать в origin/masterкачестве ссылки, как предложено @bdonlan в комментариях:git reset --hard origin/master

Брайан Кэмпбелл
источник
374
Или git reset --hard origin/master, чтобы сбросить его до того, где был источник.
bdonlan
1
Другой полезный указатель, к которому вы можете сбросить, - это ORIG_HEAD или его обобщение, использующее reflog HEAD @ {1} (последняя позиция HEAD).
Якуб Наребски
12
Читатель, перед тобой git resetтвой код. Сделайте свое будущее себе одолжение: разница между reset, reset --softи reset --hard(Что происходит с вашим ранее, git addиначе «ваша работа» :) Рисунок: ссылка
user18099
3
Обратите внимание, что при этом будет удалено все, что было в коммите, который вы хотите удалить (так что не git statusбудет отображаться никаких изменений, и коммит будет удален / изменения потеряны).
Бьёрн Бёрресен
12
ПРИМЕЧАНИЕ: будьте осторожны при использовании, так git reset --hard HEAD^как вы потеряете изменения в переданных файлах (ваши изменения будут удалены). Есть два ответвления на этот вопрос: чтобы отменить коммит, но изменения на диске все еще есть, сделайте этоgit reset --soft HEAD~1
papigee
626

ЕСЛИ вы НЕ перенесли изменения в удаленный

git reset HEAD~1

Проверьте, очищена ли рабочая копия git status.

В противном случае вы передали свои изменения на удаленный

git revert HEAD

Эта команда вернет / удалит последний коммит / изменение, а затем вы можете нажать

Джериль Курувила
источник
34
Это отвечает на вопрос «Удалить последний коммит git, который не был передан» (ближайший ответ ИМХО)
Пьер де ЛЕСПИНАЙ
25
Кроме того , он сохраняет локальные изменения , сделанные в последней фиксации, в то время как мерзавец --hard сброс не
Станимир Стоян
1
для меня это отменит последний выдвинутый коммит и незажатый коммит
CodyChan
Git Revert HEAD для меня просто удалил все файлы, которые я был готов нажать. Быть осторожен!
Джейсон Брюс
159
git reset --hard origin/master

сбросить его до того, что было в источнике.

Это было опубликовано @bdonlan в комментариях . Я добавил этот ответ для людей, которые не читают комментарии.

Shadoweb
источник
4
Этот вопрос был задан почти 5 лет назад, и это уже в одном из комментариев.
Анубиан Нуб
1
Что, если текущая локальная ветвь отличается от master- я должен использовать origin/mybranchтогда?
Павел Власов
9
Обычно я не читаю комментарии, когда спешу за ответом ... Спасибо, что
Леонардо Алвес Мачадо
Предупреждение: имейте в виду, что это удалит все ваши существующие изменения кода, кроме тех, git reset HEAD~которые только возвращают коммит в код
Mayer Spitzer
70

У этого вопроса есть две ветви (откат фиксации не означает, что я хочу потерять все свои локальные изменения):

1. Чтобы отменить последнюю фиксацию и отменить изменения в зафиксированном файле, выполните:

git reset --hard HEAD~1

2. Чтобы отменить последнюю фиксацию, но сохранить локальные изменения (на диске), выполните:

git reset --soft HEAD~1

Это (более поздняя команда) приведет вас в состояние, в котором вы были бы, если бы сделали git add.

Если вы хотите удалить файлы после этого, выполните

git reset

Теперь вы можете вносить больше изменений перед добавлением и последующей фиксацией.

papigee
источник
47

Просто введите в консоли:

$ git reset HEAD~

Эта команда отбрасывает все локальные коммиты перед удаленным HEAD

marcdahan
источник
7
Можете ли вы объяснить, что ваш ответ добавляет к существующим ответам?
Нвоигт
Это очищает текущий коммит до нажатия - без отмены изменений, которые вы внесли локально - как и другие ответы - что может быть серьезным моментом
Грант
43

Я считаю, что один из них подойдет вам

1 - Отменить фиксацию и сохранить все файлы поэтапно: git reset --soft HEAD~;

2 - Отменить фиксацию и удалить все файлы: git reset HEAD~;

3 - Отменить фиксацию и полностью удалить все изменения: git reset --hard HEAD~;

вот где я нашел ответ

М. Массула
источник
Этот ответ должен быть принят: D
Аарон Джон Сабу
30

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

git reset --soft HEAD~1

1означает последний коммит, если вы хотите удалить два последних использования 2и т. д. *

Карина Хаддад
источник
3
Привет Карина, упоминание о --softявляется отличным дополнением к возможным ответам, но не могли бы вы также упомянуть, почему? Объяснение вашего решения всегда полезно. Также попробуйте придерживаться английского языка. Спасибо
Vlastimil Ovčáčík
1
--soft- гарантирует, что вы не потеряете изменения в файле, фиксацию которого вы пытаетесь отменить
papigee
19

Я столкнулся с той же ситуацией, что и ниже, так как это намного проще. Пройдя мимо, commit-Idвы можете перейти к конкретному коммиту, на который хотите перейти:

git reset --hard {commit-id}

Поскольку вы хотите удалить свой последний коммит, вам нужно передать commit-Idтуда, куда вам нужно переместить указатель:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296
Камлеш Патидар
источник
Просто предупреждение для новичков, подобных мне, - сделайте резервную копию любых файлов, где вы хотите сохранить изменения, так как они будут возвращены к более ранней версии. Мой сценарий состоял в том, что я случайно поместил дамп базы данных в свой каталог репо, а затем зафиксировал - я явно не хотел фиксировать эти файлы в репо, но ДЕЙСТВИТЕЛЬНО хотел сохранить изменения, которые я внес в другие файлы. Поэтому мне пришлось скопировать и вставить необходимые изменения из резервной копии, которую я сделал, ДО выполнения git reset.
user1063287
10

Это то, что я делаю:

Сначала оформите вашу ветку (для моего дела masterветка):

git checkout master

Затем сбросьте на удаленный HEAD ^ ( он удалит все ваши локальные изменения ), принудительно очистите и потяните:

git reset HEAD^ --hard && git clean -df && git pull
Аднан
источник
1
Это очень ядерный вариант. Я хотел бы предложить мягкий сброс для ограниченного коммита.
c0der512
3

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

saga123
источник
блестящий ответ - это позволяет легко щелкнуть по нему в sourcetree :)
Kamil Kiełczewski
1

У меня просто была та же проблема, и в итоге я сделал:

git rebase -i HEAD~N

(N - количество коммитов, которые вам покажет git)

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

MrCas
источник