Откат до последнего коммита git


120

Я только что сделал

git commit -m "blah"

Затем я добавил несколько файлов, как мне откатиться и удалить то, что есть в моих текущих файлах, которые еще не были добавлены / зафиксированы?


15
нет, ОП просит не об этом - ясно, что он хочет откатиться к последней фиксации, а не отменить последнюю фиксацию. он не сказал, что добавил несколько файлов, а затем зафиксировал их. так ясно, что он хочет последней фиксации.
Пол

1
Слишком сложно найти ответ на этот очень распространенный вопрос
Сэм

Ответы:


211

Caveat Emptor - Впереди разрушительные команды.

Смягчение - git reflog может спасти вас, если вам это нужно.


1) ОТМЕНИТЬ изменения локального файла и СОХРАНИТЬ свою последнюю фиксацию

git reset --hard

2) ОТМЕНИТЬ изменения локального файла и УДАЛИТЬ последнюю фиксацию

git reset --hard HEAD^

3) СОХРАНИТЕ изменения локального файла и УДАЛИТЕ последнюю фиксацию

git reset --soft HEAD^

20
Эта команда удалит вашу предыдущую фиксацию, поэтому используйте ее с осторожностью! git reset --hard безопаснее
rudivonstaden

9
Черт возьми, это правильный ответ с 36 голосами за. Я только что потерял несколько дней работы из-за этого ... потому что я прочитал ответ, а не комментарий. Это не правильный ответ на вопрос!
Крис Невилл,

1
ОК, еще не все потеряно! Вы можете сделать git reflog, это позволит вам увидеть коммиты, которые вы сделали до сброса. Затем вы можете проверить эти коммиты
Крис Невилл,

3
Как бы то ни было, я интерпретировал вопрос ОП как «как мне откатить фиксацию и удалить текущие файлы», но это было и остается неоднозначным. Я бы понял иначе, если бы OP просто сказал: «Как мне удалить текущие файлы, которые не были добавлены или зафиксированы?»
Джо Ханинк,

2
Git - это полная противоположность утверждению Алана Кейса Простые вещи должны быть простыми, сложные - возможны. ... особенно его первой части. Тем не менее, спасибо за ваш ответ. это помогло.
0xC0000022L

46

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

git reset --hard

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

git reset --hard HEAD^

Чтобы удалить неотслеживаемые файлы (чтобы новые файлы еще не добавлены в индекс) и папки, используйте:

git clean --force -d

git reset --hard HEAD ^ удаляет мою последнюю фиксацию навсегда? как будто я не могу вернуться к этому?
user137717

похоже, что "git clean --force -d" также удаляет папки .gitignored
Алексей Тимохин

15

git reset --hard вернет рабочий каталог к ​​последней фиксации и удалит новые / измененные файлы.


2
сделал это, но файлы все еще там. (неотслеживаемые файлы все еще там)
Blankman

в этом случае вы можете сделать «git stash»
jacktrade

3
проголосовали за, потому что это единственный четкий и недвусмысленный ответ на четкий и недвусмысленный вопрос ОП.
Пол

4

Вы можете отменить фиксацию, используя git revert HEAD^для возврата к предпоследней фиксации. Вы также можете указать фиксацию для возврата, используя идентификатор вместо HEAD ^


Это не «возврат» в том смысле, который вы говорите. Это создает обратную фиксацию.
Стефан Кендалл,


3

Простой надежный способ отменить изменения локального файла с момента последней фиксации - поместить их в новую ветку:

git branch changes
git checkout changes
git add .
git commit

Это оставляет изменения в новой ветке. Вернитесь к исходной ветке, чтобы найти ее обратно к последней фиксации:

git checkout master

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.