5.4 KiB
Памятка: как синхронизировать локальную ветку после git push --force-with-lease
Эта инструкция подходит для ситуации, когда удалённая ветка была переписана через git push --force-with-lease, и теперь локальная ветка расходится с origin.
Если локальных изменений нет
Если у тебя нет никаких локальных изменений, которые нужно сохранить, это хорошо: можно безопасно заменить указатель локальной ветки на удалённую.
В таком случае ничего нужного не пропадёт.
1. Сделай git fetch
git fetch
2. Посмотри, где расходятся ветки
git log --oneline --decorate --color --graph --all
С помощью графа можно увидеть, где локальная и удалённая ветки расходятся в истории.
Например:
feature/student
origin/feature/student
feature/student — локальная ветка, origin/feature/student — состояние этой ветки в удалённом репозитории.
3. Перемести указатель локальной ветки на удалённую
Сначала перейди на нужную локальную ветку:
git checkout feature/student
Затем:
git reset --hard origin/feature/student
После этого локальная feature/student будет указывать на тот же коммит, что и origin/feature/student.
Весь сценарий целиком
git fetch
git log --oneline --decorate --color --graph --all
git checkout feature/student
git reset --hard origin/feature/student
Если локальные изменения нужно сохранить
В этом случае не нужно сразу делать git reset --hard.
reset --hard изменит состояние рабочей директории и может удалить незакоммиченные изменения.
Сначала нужно сохранить свою работу.
Вариант 1. Изменения уже закоммичены
Если твои изменения находятся в локальных коммитах, самый простой и надёжный вариант — сначала создать дополнительную ветку, которая будет указывать на текущее состояние:
git checkout feature/student
git branch backup/feature-student
Теперь у тебя есть резервная ветка:
backup/feature-student
↓
твои старые коммиты
feature/student
↓
твои старые коммиты
После этого можно безопаснее двигать feature/student:
git fetch
git reset --hard origin/feature/student
Резервная ветка backup/feature-student при этом никуда не исчезнет.
Если позже выяснится, что какие-то коммиты из старой истории нужны, их можно перенести в новую историю с помощью git cherry-pick.
Например:
git cherry-pick <commit>
Вариант 2. Есть незакоммиченные изменения
Если ты что-то изменил, но ещё не сделал git commit, сначала сохрани изменения.
Один из удобных вариантов — временно убрать их в stash:
git stash push -u -m "backup before force-push recovery"
После этого рабочая директория станет чистой, и можно выполнять:
git fetch
git checkout feature/student
git reset --hard origin/feature/student
Затем можно вернуть сохранённые изменения:
git stash pop
Git попытается применить их поверх новой истории.
Если возникнут конфликты, их нужно будет разрешить вручную.
Самое важное правило
Перед:
git reset --hard origin/feature/student
нужно ответить на вопрос:
Есть ли у меня локальные изменения, которые я не хочу потерять?
Если нет
Можно:
git reset --hard origin/feature/student
Если да, но изменения закоммичены
Сначала создай резервную ветку:
git branch backup/feature-student
Если да, но изменения ещё не закоммичены
Сначала используй stash:
git stash push -u -m "backup before force-push recovery"
И только после этого выполняй reset --hard.
Принцип простой: сначала сохранить то, что может понадобиться, потом двигать указатель ветки.