Сброс репозитория Git: stash, reset, clean и клонирование

Быстрая навигация
- Сохранение изменений — Git Stash
- Полный сброс — Git Reset
- Очистка неотслеживаемых файлов — Git Clean
- Альтернатива: клонирование нового репозитория
Git предоставляет мощные инструменты для восстановления рабочей копии. Они позволяют откатиться к состоянию удалённой ветки или к определённому коммиту. Ниже — практическое руководство с рекомендациями, примерами и чеклистами.
Сохранение изменений (Git Stash)
Перед выполнением любых команд сброса убедитесь, что не потеряете важные незакоммиченные изменения.
Короткое пояснение: git stash временно прячет ваши незакоммиченные изменения в стек, чтобы рабочая директория вернулась к чистому состоянию.
Важно: есть несколько видов сбросов. Soft и mixed сбрасывают состояние индекса/HEAD, но сохраняют незакоммиченные изменения. Hard удаляет незакоммиченные изменения — это разрушительная операция.

Простой пример: сохраните изменения в стеке:
git stashПрименить сохранённый стек (не удаляет запись из стека):
git stash applyЕсли вы хотите сохранить изменения навсегда, можно создать новую ветку и закоммитить изменения туда, чтобы история их сохранила и при необходимости отправить в удалённый репозиторий:
git checkout -b my-temp-work
git add .
git commit -m "WIP: временное сохранение"Когда это уместно:
- Вы экспериментируете и хотите вернуться к чистому состоянию, не теряя прогресса.
- Нельзя потерять незакоммиченные конфигурационные файлы.
Когда это не сработает:
- Если ваши изменения касаются новых неотслеживаемых файлов (по умолчанию git stash их не сохраняет без флага).
Совет: чтобы сохранить и неотслеживаемые файлы, используйте:
git stash --include-untrackedВыполнение сброса (Git Reset)
Короткое пояснение: git reset перемещает указатель ветки (HEAD) на выбранный коммит и может изменить индекс и рабочую копию в зависимости от флага (soft/mixed/hard).
Шаги перед сбросом:
- Получите актуальное состояние удалённого репозитория, обычно origin:
git fetch origin- Переключитесь на ветку, которую хотите привести в порядок (например, master):
git checkout master- (Опционально) можно выбрать конкретный коммит по ID:
git checkout 342c47a4- Жёсткий сброс к актуальной удалённой ветке (удаляет незакоммиченные изменения в tracked-файлах):
git reset --hard origin/masterПримечание: git reset –hard — разрушительная команда. Убедитесь, что у вас есть резервные копии или вы использовали git stash/коммит, если хотите сохранить результат работы.
Альтернативы и сценарии:
- soft reset: сохранит изменения в рабочей директории и индексе для дальнейшего редактирования и нового коммита.
- mixed reset (поведение по умолчанию без флага): снимет изменения из индекса, но оставит их в рабочей директории.
Когда reset не решит проблему:
- Если проблема в неотслеживаемых артефактах сборки, сброс tracked-файлов не удалит их — нужен git clean.
Очистка неотслеживаемых файлов (Git Clean)
Короткое пояснение: git clean удаляет файлы и каталоги, которые не отслеживаются Git (часто это артефакты сборки, кэши, лог-файлы).
Команда для удаления неотслеживаемых директорий и файлов принудительно:
git clean -d --forceВажно: git clean не трогает файлы, перечисленные в .gitignore, если вы явно не укажете соответствующие флаги.
Когда запускать:
- Когда рабочая директория содержит много временных файлов, которые мешают сборке или тестам.
- Если вы хотите вернуть проект в точную копию удалённой ветки.
Можно запустить git clean без reset — это полезно, если вы хотите оставить код, но удалить артефакты сборки.
Предварительно посмотреть, что удалится:
git clean -d --dry-runАльтернатива: клонирование нового репозитория
Иногда проще и быстрее полностью удалить локальную папку и клонировать репозиторий заново. Это сбрасывает всё до состояния удалённого репозитория и удобно при серьёзном рассогласовании.
Пример последовательности:
sudo rm -r git-repositorygit clone https://github.com/user/git-repository.git
cd git-repositoryУчтите:
- Это восстановит состояние только до удалённого репозитория, а не до локального коммита, который был только у вас.
- По умолчанию клонируется ветка master; переключитесь позже с помощью git switch или клонируйте с флагом -b:
git clone -b my-branch https://github.com/user/git-repository.gitРешение: когда что выбрать (decision tree)
flowchart TD
A[Есть незакоммиченные изменения?] -->|Да| B{Это важная работа?}
A -->|Нет| C[Нужен только reset или clean]
B -->|Да| D[Сохранить: git stash или коммит в новую ветку]
B -->|Нет| E[Можно жёстко сбросить]
D --> C
E --> F[git reset --hard origin/branch]
C --> G{Есть неотслеживаемые артефакты?}
G -->|Да| H[git clean -d --force]
G -->|Нет| I[Закончено]Ролевые чеклисты
Разработчик:
- Сделать git stash или закоммитить WIP в новую ветку.
- Выполнить git fetch origin.
- git checkout нужной ветки.
- git reset –hard origin/ветка.
- git clean -d –dry-run, затем git clean -d –force.
Технический лидер / ревьюер:
- Проверить, что никто не работает в локальных ветках с важными коммитами.
- Убедиться, что удалённый репозиторий актуален и содержит нужную историю.
DevOps / SRE:
- Проверить CI/CD, если перестроение требуется после сброса.
- Убедиться, что артефакты не теряются (хранилища артефактов, кеши).
Критерии приёмки
- Локальная ветка совпадает с выбранной удалённой веткой (git status показывает чистую рабочую директорию).
- Сборка проходит без ошибок, если это ожидаемое состояние.
- Не осталось незакоммиченных изменений или неожиданных неотслеживаемых файлов.
Риски и смягчение
Риск: потеря незакоммиченных изменений. Смягчение: всегда делать git stash или коммит в новую ветку перед жестким сбросом.
Риск: удаление важных неотслеживаемых конфигураций. Смягчение: проверьте список таких файлов в .gitignore и сделайте резервную копию.
Быстрый чеклист перед любым сбросом
- git fetch origin
- git status — убедиться в состоянии рабочей директории
- git stash или коммит в новую ветку (если нужно сохранить работу)
- git reset –hard origin/ветка
- git clean -d –dry-run, затем git clean -d –force
Краткое резюме
Git умеет восстанавливать состояние проекта несколькими путями: stash хранит незавершённую работу; reset возвращает tracked-файлы к состоянию коммита; clean удаляет неотслеживаемые артефакты; а полное клонирование восстанавливает точную копию удалённого репозитория. Выбирайте инструмент в зависимости от того, хотите ли вы сохранить текущую работу и от наличия неотслеживаемых файлов.
Примечание: всегда делайте dry-run или резервную копию перед разрушительными командами.
