2009-10-23 2 views
313

Я сделал git commit, но я не нажал других. поэтому, когда я делаю «статус git», я получаю «# Ваша ветка впереди« хозяина »на 1 commit».Удалите git commit, который не нажал

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

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316 

, учитывая, что, когда я делаю„журнал GIT“

 
commit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316 
Date: Tue Sep 29 11:21:41 2009 -0700 


commit db0c078d5286b837532ff5e276dcf91885df2296 
Date: Tue Sep 22 10:31:37 2009 -0700
+6

Этот вопрос возник в копилке другого вопроса: http://stackoverflow.com/questions/1338728/how -to-delete-a-git-commit –

+0

Возможный дубликат [Удалить коммит из ветки в Git] (https://stackoverflow.com/questions/1338728/delete-commits-from-a-branch-in-git) –

+0

Возможный дубликат [Как вернуть репозиторий Git к предыдущей фиксации?] (Https://stackoverflow.com/questions/4114095/how-to-revert-git-repository-to-a-previous-commit) –

ответ

306

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

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

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

Кроме того, вместо РУКОВОДИТЕЛЯ вы можете использовать origin/master в качестве ссылки, как это было предложено @bdonlan в комментариях: git reset --hard origin/master

+223

Или 'git reset - грубое происхождение/master', чтобы сбросить его до того, что происходило. – bdonlan

+0

Да, это тоже полезно. –

+1

Другим полезным указателем, который вы можете сбросить, является ORIG \ _HEAD или его обобщение с использованием reflog HEAD @ {1} (последняя позиция HEAD). –

267

Если вы не отодвигают свои изменения в удаленном

git reset HEAD~1 

Check если рабочая копия очищена git status.

ELSE вы подтолкнули изменения к удаленному

git revert HEAD 

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

+11

Это ответ на «Удалить последнее git-коммит, который не был нажат» (ближайший ответ IMHO) –

+9

Кроме того, он сохраняет локальные изменения в последнем фиксации, тогда как git reset --hard не –

103
git reset --hard origin/master 

, чтобы сбросить его на то, происхождение было в.

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

+2

Этот вопрос был задан почти 5 лет назад, и это уже в одном из комментариев. –

+1

Что делать, если текущая локальная ветвь отличается от «master» - следует ли использовать «origin/mybranch»? –

+0

Спасибо за обмен! Это единственный, который работал для меня. – Hajjat

11

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

git reset --hard {commit-id} 

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

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296 
+0

Просто предупреждение для новичков вроде меня - создайте резервные копии любых файлов, где вы хотите ХРАНИТЬ изменения, поскольку они будут возвращены к более ранней версии. Мой сценарий состоял в том, что я случайно поместил дамп базы данных в свой каталог репо, а затем зафиксировал - я, очевидно, не хотел передавать эти файлы в репо, но DID хотел сохранить изменения, внесенные мной в другие файлы. Поэтому мне пришлось скопировать и вставить необходимые изменения из резервной копии, сделанной до того, как выполнить сброс git. – user1063287

0

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

0

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

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

git checkout master 

Затем восстановите дистанционный РУКОВОДИТЕЛЬ^(это будет удалить все ваши локальные изменения), force clean and pull: