Бывают ситуации, когда локальные изменения в ветке настолько запутались, что проще полностью сбросить всё и начать «с чистого листа» от удаленной версии. В этой статье рассмотрим два надежных способа, как это сделать.
Ситуация
Представьте: вы работаете над фичей в ветке feature/new-design, накоммитили кучу экспериментального кода, а потом поняли, что всё пошло не так. Или просто хотите получить точную копию ветки из удаленного репозитория, полностью удалив локальные изменения.
Нам нужно:
- Скачать последнюю версию из
origin - Полностью заменить локальную ветку на удаленную
- Удалить все локальные коммиты и изменения
Способ 1: git reset —hard
Это самый прямой способ — вы просто сбрасываете локальную ветку до состояния удаленной.
Пошаговая инструкция:
|
1 2 3 4 5 |
# 1. Получаем последние изменения из удаленного репозитория git fetch origin # 2. Сбрасываем локальную ветку до состояния origin/название_ветки git reset --hard origin/название_ветки |
Что происходит:
git fetch origin— загружает свежие данные из удаленного репозитория, не сливая их с локальной веткой. Это безопасная команда.git reset --hard origin/название_ветки— выполняет жесткий сброс:- Указатель ветки перемещается на тот же коммит, что и в
origin - Полностью удаляются все локальные коммиты, которых нет в удаленной ветке
- Безвозвратно стираются все некоммиченные изменения в рабочей директории
- Указатель ветки перемещается на тот же коммит, что и в
Способ 2: удалить и создать ветку заново
Этот способ еще более радикальный — вы полностью удаляете локальную ветку и создаете её заново из удаленного репозитория.
Пошаговая инструкция:
|
1 2 3 4 5 6 7 8 |
# 1. Переключаемся на другую ветку (нельзя удалить текущую ветку) git checkout main # 2. Удаляем локальную ветку (флаг -D для принудительного удаления) git branch -D feature/new-design # 3. Создаем ветку заново из удаленного репозитория git checkout -b feature/new-design origin/feature/new-design |
Что происходит:
git branch -D— удаляет локальную ветку даже если она не слита с другими ветками (флаг-D— это форсированное удаление, в отличие от-d, который требует слияния).git checkout -b feature/new-design origin/feature/new-design— создает новую локальную ветку с тем же именем, которая будет «следить» за удаленной веткой.
