cherry-pick, stash, reset, revert, reflog
↑ 6.1 Git · ← Предыдущая
Зачем это на собесе
Инструменты «спасения»: отменить коммит, вернуть потерянное, перенести изменения.
Объяснение
cherry-pick — перенос конкретного коммита в текущую ветку.
git cherry-pick a1b2c3d # один коммит
git cherry-pick A^..B # диапазон
git cherry-pick -x <hash> # добавить ссылку на исходный коммитПрименение: hotfix из main в релизную ветку, перенос полезного коммита между ветками.
stash — временно спрятать незакоммиченные изменения.
git stash push -m "wip: filters" -u # -u — включая неотслеживаемые
git stash list / git stash show -p stash@{0}
git stash pop / git stash apply / git stash drop
git stash branch new-branch stash@{0}reset — перемещает ветку (и опционально индекс/рабочий каталог) на другой коммит.
| Режим | Указатель ветки | Индекс | Рабочий каталог | Использование |
|---|---|---|---|---|
--soft | сдвигает | сохраняет | сохраняет | переупаковать коммиты |
--mixed (по умолчанию) | сдвигает | сбрасывает | сохраняет | отменить add и коммит |
--hard | сдвигает | сбрасывает | сбрасывает | выбросить всё (опасно) |
git reset --soft HEAD~1 # отменить коммит, оставить изменения в индексе
git reset --hard origin/main # привести ветку к состоянию remoterevert — создаёт новый коммит, отменяющий изменения указанного; безопасен для опубликованной истории.
git revert a1b2c3d
git revert -m 1 <merge-commit> # отменить merge (выбрать основного родителя)reflog — журнал перемещений HEAD и веток (локально, ~90 дней): спасение после reset --hard, неудачного rebase, удалённой ветки.
git reflog
git reset --hard HEAD@{3} # вернуться к состоянию до ошибки
git branch rescue <hash> # восстановить «потерянный» коммитСводка: локальное «переписать» → reset/rebase, опубликованное «отменить» → revert; потеряли коммит → reflog; нужно «переключиться и не терять» → stash.
Нюансы и подводные камни
reset --hardудаляет незакоммиченные изменения без возможности восстановления (кроме IDE local history).revertотменённого merge затем требует «revert the revert» для повторного вливания.cherry-pickсоздаёт дубликат коммита: при последующем merge возможны конфликты.stashне по умолчанию включает неотслеживаемые файлы.- Reflog локален и не переносится на другие машины.
Практика
- Намеренно сломайте историю
reset --hardи восстановите черезreflog. - Отмените merge-коммит через
revert -m 1. - Перенесите hotfix-коммит в релизную ветку
cherry-pick -x.
Вопросы с ответами
Чем
resetотличается отrevert?
resetпереписывает историю ветки,revertдобавляет новый коммит, отменяющий изменения, и безопасен для общих веток.
Как вернуть коммит после неудачного
reset --hard?Найти хэш в
git reflogи вернуться на него (reset --hardили новая ветка).