Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save an-ivannikov/88144f0f5c3a84191b332b77c60c9cd5 to your computer and use it in GitHub Desktop.
Save an-ivannikov/88144f0f5c3a84191b332b77c60c9cd5 to your computer and use it in GitHub Desktop.
# Git: синхронизация локального репо с удаленным
> http://qaru.site/questions/39175/git-sync-local-repo-with-remote-one
git fetch # This updates 'remote' portion of local repo.
git reset --hard origin/<your-working-branch>
===
# http://qaru.site/questions/39175/git-sync-local-repo-with-remote-one
===
Git: синхронизация локального репо с удаленным
У меня есть локальные и удаленные репозитории git. Я хочу синхронизировать мой локальный репозиторий с удаленным репозиторием, чтобы мой локальный репозиторий стал 100% -ной копией удаленного репозитория. Это означает, что если определенные файлы отличаются в этих репозиториях, мы переопределяем локальные с удаленными. И если в локальных репозиториях, которые не существуют в удаленном репо, локальные файлы удаляются.
Есть ли способ достичь этого, кроме создания нового клона удаленного репо?
Подобный вопрос, как Синхронизация локального репозитория git с удаленным удалением с удалением локальных изменений/коммитов.
157
задан Axl 16 июня '11 в 17:10 источникподелиться
8 ответов
git fetch --prune
-p, --prune
После извлечения удалите все ветки удаленного отслеживания, которые больше не существуют на пульте дистанционного управления. параметры обрезки
168
ответ дан jobwat 28 февр. '13 в 2:54 источникподелиться
Вам нужно понять, что репозиторий Git - это не просто дерево каталогов и файлов, но также хранит историю этих деревьев, которая может содержать ветки и слияния.
При извлечении из репозитория вы скопируете все или некоторые из ветвей в ваш репозиторий. Они затем находятся в вашем репозитории как "ветки удаленного отслеживания", например. ветки, названные как remotes/origin/master или такие.
Получение новых коммитов из удаленного репозитория ничего не изменит о вашей локальной рабочей копии.
Ваша рабочая копия обычно имеет фиксацию, называемую HEAD. Эта фиксация обычно является концом одного из ваших локальных ветвей.
Я думаю, что вы хотите обновить локальную ветку (или, возможно, все локальные ветки?), в соответствующую удаленную ветвь, а затем проверить последнюю ветвь.
Чтобы избежать конфликтов с вашей рабочей копией (которые могут иметь локальные изменения), вы сначала очищаете все, что не является версией (используя git clean). Затем вы проверяете местную ветку, соответствующую удаленной ветке, которую хотите обновить, и используйте git reset, чтобы переключить ее на выбранную удаленную ветвь. (git pull будет включать все обновления удаленной ветки в вашем локальном, что может сделать то же самое, или создать комманду слияния, если у вас есть локальные коммиты.)
(Но тогда вы действительно потеряете любые локальные изменения - как в рабочей копии, так и в локальных коммитах. Убедитесь, что вы действительно этого хотите, иначе лучше использовать новую ветку, это экономит ваши локальные коммиты. И используйте git stash для сохранения изменения, которые еще не совершены.)
Edit: Если у вас есть только одна локальная ветвь и отслеживается одна удаленная ветвь, все, что вам нужно сделать, это
git pull
из рабочего каталога.
Это позволит получить текущую версию всех отслеживаемых удаленных веток и обновить текущую ветку (и рабочий каталог) до текущей версии удаленной ветки, которую она отслеживает.
80
ответ дан Paŭlo Ebermann 16 июня '11 в 17:26 источникподелиться
Эти шаги сделают это:
git reset --hard HEAD
git clean -f -x -d -n
то без -n
Это позаботится обо всех локальных изменениях. Теперь коммит...
git status
и обратите внимание на строку, например:
Your branch is ahead of 'xxxx' by N commits.
Обратите внимание на число "N" Сейчас:
git reset --hard HEAD~N
git pull
и, наконец:
git status
не должен показывать ничего для добавления/фиксации. Все чистые.
Однако новый клон может сделать то же самое (но очень медленно).
=== Обновлено ===
Поскольку мои знания git немного улучшились по сравнению с тем временем, я придумал еще один более простой способ сделать то же самое. Вот как (# с объяснением). В вашей рабочей ветке:
git fetch # This updates 'remote' portion of local repo.
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.
Хотя ваши локальные коммиты и изменения исчезнут из виду после этого, при необходимости можно восстановить совершенные изменения.
70
ответ дан FractalSpace 06 сент. '12 в 22:09 источникподелиться
Вы хотите сделать
git fetch origin
git reset --hard origin/master
git clean -f -d
Это делает ваше местное репо точно так же, как ваше дистанционное репо.
Не забудьте заменить источник и мастер удаленным и ветки, с которым вы хотите синхронизировать.
34
ответ дан aandis 23 мая '14 в 21:14 источникподелиться
(Эта информация от Руководство пользователя Git)
Я тоже участвую, поэтому это может быть не совсем ответ на вопрос, но он может помочь кому-то:
Когда удаленный репозиторий изначально клонирован, копии всех ветвей хранятся в вашем локальном репозитории (просмотр их с помощью git branch -r)
Чтобы обновить эти копии и сделать их актуальными (т.е. синхронизировать их с удаленной ветвью), используйте git fetch. Это не повлияет на любые существующие вами настраиваемые ветки.
Чтобы переопределить вашу локальную проверку ветки новую версию любой ветки, на которой вы работаете (предположим, что вы уже выполнили git add origin /path/to/repository), используйте git checkout origin/branch_name, это переопределит ваши изменения локальных жителей в ветке branch_name
3
ответ дан tjb 16 февр. '12 в 13:34 источникподелиться
Похоже, вы хотите зеркало удаленного репозитория:
git clone --mirror url://to/remote.git local.git
Эта команда создает пустой репозиторий. Если вам не нужен голый репозиторий, все усложняется.
2
ответ дан Richard Hansen 17 июня '11 в 8:50 источникподелиться
Если вы говорите об синхронизации разветвленного репо, вы можете выполнить следующие шаги.
Как синхронизировать репозиторий fork из git
проверьте текущую ветвь git
git branch
проверка, если вы не находитесь на главном
git checkout master
Извлеките восходящий репозиторий, если у вас есть правильные права доступа
git fetch upstream
Если вы получаете ошибку ниже, запустите
git remote add upstream git@github.com:upstream_clone_repo_url/xyz.git
fatal: 'upstream/master' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
Теперь запустите приведенную ниже команду.
git fetch upstream
Теперь, если вы на хозяине, объедините восходящий/ведущий в главную ветвь
git merge upstream/master
Что это!
Перекрестная проверка через команду git remote, более конкретную git remote -v
Если у меня также есть права на восходящее репо, я могу создать локальную ветвь вверх и выполнить работу, которая будет идти вверх по течению там.
1
ответ дан Nishant Upadhyay 11 марта '15 в 12:49 источникподелиться
Вы можете использовать git hooks для этого. Просто создайте крючок, который подталкивает к другому репо после обновления.
Конечно, вы можете столкнуться с конфликтами слияния, поэтому вам нужно понять, как с ними бороться.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment