Как откатить изменения в Git: git reset, revert и stash на практике

Привет, коллеги! Если вы хоть раз работали с Git, то наверняка сталкивались с ситуацией, когда нужно откатить изменения: случайно закоммитили не тот файл, сделали экспериментальный коммит, который сломал билд, или просто захотелось вернуться к прошлой версии кода. В такие моменты на сцену выходят три кита: git reset, git revert и git stash. Сегодня разберёмся, как правильно ими пользоваться, чтобы не словить facepalm и не потерять важные данные.

Почему это важно?

Git — штука мощная, но иногда слишком уж. Одна команда не туда — и привет, потерянные коммиты или сломанная история. Откат изменений — это не только про исправление ошибок, но и про уверенность в своих экспериментах и чистоту репозитория. Понимание различий между reset, revert и stash экономит нервы и время.

Что потребуется

  • Любая современная ОС: Linux, macOS, Windows — всё поддерживается.
  • Установленный Git версии 2.x и выше.
  • Терминал (bash, zsh, PowerShell — не важно).
  • Минимальные знания командной строки и основ работы с Git (init, add, commit, log).

Установка Git: пошаговая инструкция

  1. Linux (Debian/Ubuntu):
    sudo apt update && sudo apt install git
  2. macOS (через Homebrew):
    brew install git
  3. Windows:
    Скачайте и установите Git с официального сайта, следуя инструкциям мастера установки.
  4. Проверьте установку:
    git --version
  5. Настройте имя и почту (обязательно!):
    git config --global user.name "Ваше Имя"
    git config --global user.email "ваш@email.com"

Использование: полный список команд и вариантов

1. git reset

Для чего: Откатывает коммиты и/или изменения в рабочем каталоге.
Варианты:

  • git reset --soft HEAD~1 — откатить последний коммит, но оставить изменения в staging area (индексе).
  • git reset --mixed HEAD~1 (по умолчанию) — откатить коммит, изменения останутся в рабочем каталоге, но из индекса уберутся.
  • git reset --hard HEAD~1полный откат: удаляет последний коммит и все изменения безвозвратно (если не использовать reflog).
  • git reset [commit] — откат к любому коммиту (можно взять hash из git log).

Важно: git reset переписывает историю. Не используйте на публичных ветках!

2. git revert

Для чего: Создаёт новый коммит, отменяющий изменения предыдущего коммита. История не ломается.
Варианты:

  • git revert HEAD — отменить последний коммит.
  • git revert [commit] — отменить конкретный коммит по hash.
  • git revert HEAD~2..HEAD — отменить сразу несколько коммитов (смотрите синтаксис в официальной документации).

Плюсы: Безопасно для публичных веток, история не ломается.

3. git stash

Для чего: Временно убирает незакоммиченные изменения из рабочей директории, чтобы переключиться на другую ветку или делать другие дела.
Варианты:

  • git stash — убрать все незакоммиченные изменения (по умолчанию только отслеживаемые файлы).
  • git stash -u — убрать и неотслеживаемые файлы (untracked).
  • git stash list — посмотреть список сохранённых stash’ей.
  • git stash apply [stash@{n}] — вернуть изменения обратно (без удаления из списка).
  • git stash pop — вернуть изменения и удалить stash из списка.
  • git stash drop [stash@{n}] — удалить конкретный stash.

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

Ошибки и как делать не надо

  • Не делайте git reset --hard на публичных ветках! Это может привести к конфликтам у коллег и потере истории.
  • Не забывайте про git stash: если у вас есть незакоммиченные изменения, а вы хотите сменить ветку — stash спасает от лишних коммитов или конфликтов.
  • Не используйте git revert для отката merge-коммитов без флага -m. Откатывать merge-коммиты — отдельная тема, тут могут быть нюансы.
  • Всегда делайте git status и git log перед откатами. Проверьте, что вы откатываете именно то, что надо.

Пример реального использования

# Сценарий: случайно закоммитили багованный код в ветку develop

git log --oneline
# Видим, что последний коммит — баг

git revert HEAD
# Создаётся новый коммит, который отменяет изменения бага
# Push в репозиторий — и коллеги не пострадают

# Или, если коммит локальный и никуда не ушёл:
git reset --soft HEAD~1
# Изменения остаются в staging, можно поправить и закоммитить заново

# Если надо временно спрятать наработки и переключиться на другую задачу:
git stash
git checkout master
# Работаем с master
git checkout develop
git stash pop
# Возвращаем свои изменения

Заключение

Откатывать изменения в Git — не страшно, если знаешь, каким инструментом пользоваться. reset — для локальных исправлений, revert — для публичных веток, stash — для временного хранения изменений. Главное — не паниковать, а читать документацию и не бояться экспериментировать в локальных ветках. Да пребудет с вами чистая история коммитов!

Хотите прочитать больше про Администрирование?
Отзывов нет.

Ваш отзыв

Пожалуйста, заполните поля снизу и добавьте отзыв!.
Имя *
E-mail *
Сайт
Сообщение *