cherry-pick, stash, reset, revert, reflog

↑ 6.1 Git · ← Предыдущая

Желательно~3 мин чтенияУровень: middle

Зачем это на собесе

Инструменты «спасения»: отменить коммит, вернуть потерянное, перенести изменения.

Объяснение

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           # привести ветку к состоянию remote

revert — создаёт новый коммит, отменяющий изменения указанного; безопасен для опубликованной истории.

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 локален и не переносится на другие машины.

Практика

  1. Намеренно сломайте историю reset --hard и восстановите через reflog.
  2. Отмените merge-коммит через revert -m 1.
  3. Перенесите hotfix-коммит в релизную ветку cherry-pick -x.

Вопросы с ответами

Связанные темы