Back

Git Force Pull: Как безопасно перезаписать локальные изменения и синхронизироваться с удаленным репозиторием

Git Force Pull: Как безопасно перезаписать локальные изменения и синхронизироваться с удаленным репозиторием

Вы когда-нибудь сталкивались с ошибкой ""Ваши локальные изменения будут перезаписаны слиянием"" при попытке выполнить git pull? Многие разработчики испытывают трудности с тем, как принудительно выполнить git pull для перезаписи локальных файлов и синхронизации с удаленным репозиторием. В этой статье объясняется правильный способ принудительного pull в Git без потери вашей работы или нарушения вашего репозитория.

Ключевые выводы

  • Используйте git fetch + git reset --hard для перезаписи локальных изменений, а не git pull --force
  • git branch <backup-name> можно использовать для резервного копирования локальных изменений перед сбросом
  • git stash удобен для временного сохранения изменений, но может привести к конфликтам слияния
  • git clean удаляет неотслеживаемые файлы - используйте с осторожностью!

Что такое Git Force Pull?

git pull --force - это распространенное заблуждение. Многие разработчики думают, что эта команда перезапишет их локальные изменения удаленной версией. Однако git pull --force на самом деле делает нечто иное - она позволяет вам выполнить pull из удаленной ветки с расходящейся историей, перезаписывая вашу локальную историю. Она не перезаписывает незафиксированные локальные изменения.

Как правильно перезаписать локальные изменения

Чтобы действительно перезаписать все локальные изменения и сделать вашу ветку идентичной удаленной версии, вам нужно использовать git fetch и git reset --hard:

git fetch origin
git reset --hard origin/main

Вот что делают эти команды:

  1. git fetch origin загружает последние изменения из удаленного репозитория, но не сливает их.
  2. git reset --hard origin/main перемещает указатель вашей локальной ветки в соответствие с удаленной веткой main, отбрасывая все локальные изменения.

:warning: Предупреждение: git reset --hard безвозвратно удалит все незафиксированные локальные изменения. Убедитесь, что вы действительно хотите отменить свою локальную работу, прежде чем выполнять это!

Резервное копирование локальных изменений

Если вы не уверены, нужны ли вам локальные изменения или нет, вы можете создать резервную ветку перед сбросом:

git branch backup-main
git fetch origin
git reset --hard origin/main

Теперь ваши локальные изменения сохранены в ветке backup-main, а ваша ветка main синхронизирована с удаленной.

Скрытие изменений

Еще один способ временно отложить локальные изменения - это git stash:

git stash push
git fetch origin
git reset --hard origin/main
git stash pop

Это сохраняет ваши локальные изменения, сбрасывает вашу ветку, а затем повторно применяет изменения поверх нее. Обратите внимание, что после stash pop вам может потребоваться разрешить конфликты слияния.

Удаление неотслеживаемых файлов

По умолчанию git reset не затрагивает файлы, которые не отслеживаются Git (файлы, которые вы никогда не добавляли с помощью git add). Чтобы также удалить эти файлы, используйте git clean:

git fetch origin
git reset --hard origin/main 
git clean -fd

:warning: Предупреждение: Как и git reset --hard, git clean необратим, поэтому будьте осторожны!

Заключение

Хотя git pull --force может звучать как правильная команда, лучше использовать git fetch и git reset --hard для перезаписи локальных изменений и синхронизации с удаленным репозиторием. Просто будьте осторожны, так как reset --hard и clean -fd необратимы! В случае сомнений создайте резервную копию своей локальной работы с помощью git branch или git stash перед сбросом. Удачного принудительного pull!

Часто задаваемые вопросы

`git reset --hard` отменит все локальные коммиты, которые не были отправлены. Вы можете сначала использовать `git branch` для их резервного копирования.

Конфликты слияния могут возникнуть при повторном применении скрытых изменений поверх новых коммитов. Вам нужно будет разрешить конфликты вручную, затем выполнить `git add` и `git commit`, чтобы завершить применение stash.

Обычно вы можете восстановиться после случайного `git reset --hard`, используя `git reflog`, чтобы найти коммит, на котором вы были до сброса, затем выполнить `git reset --hard <commit>` на этот хэш коммита.

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers