Синхронизация локального репозитория Git с удаленным - PullRequest
233 голосов
/ 16 июня 2011

Я хочу синхронизировать свой локальный репозиторий с удаленным, чтобы мой локальный репозиторий стал на 100% копией удаленного - это означает, что если некоторые файлы отличаются в этих репозиториях, мы переопределяем локальные с удаленными, и если в удаленных хранилищах есть файлы, которых нет на удаленном компьютере, локальные файлы удаляются.

Есть ли способ достичь этого, кроме как сделать свежий клон удаленного хранилища?

Подобный вопрос как Синхронизация локального git-репо с удаленным в один прием, отмена локальных изменений / фиксаций .

Ответы [ 9 ]

277 голосов
/ 28 февраля 2013
git fetch --prune

-p, --prune
После извлечения удалите все ветви удаленного отслеживания, которые больше не существуют на пульте. Параметры чернослива

118 голосов
/ 06 сентября 2012

Эти шаги сделают это:

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.

Несмотря на то, что ваши локальные коммиты и изменения исчезнут из поля зрения после этого, при необходимости можно восстановить зафиксированные изменения.

89 голосов
/ 16 июня 2011

Вы должны понимать, что репозиторий Git - это не просто дерево каталогов и файлов, но также хранит историю этих деревьев - которые могут содержать ветви и слияния.

При извлечении из репозитория вы скопируете все или некоторые из его ветвей в свой репозиторий. Затем они находятся в вашем хранилище как «ветви удаленного отслеживания», например, ветви с именами remotes/origin/master или около того

Извлечение новых коммитов из удаленного репозитория ничего не изменит в вашей локальной рабочей копии.

Как правило, ваша рабочая копия извлекается из фиксации, которая называется HEAD. Этот коммит обычно является наконечником одного из ваших местных филиалов.

Я думаю, что вы хотите обновить свою локальную ветвь (или, может быть, все локальные ветки?) До соответствующей удаленной ветки, а затем проверить последнюю ветку.

Чтобы избежать любых конфликтов с вашей рабочей копией (которые могут иметь локальные изменения), сначала вы должны очистить все, что не является версионным (используя git clean). Затем вы проверяете локальную ветвь, соответствующую удаленной ветке, которую хотите обновить, и используете git reset, чтобы переключить ее на извлеченную удаленную ветку. (git pull будет включать все обновления удаленной ветви в вашей локальной ветке, которые могут делать то же самое, или создавать коммит слияния, если у вас есть локальные коммиты.)

(Но тогда вы действительно потеряете все локальные изменения - как в рабочей копии, так и в локальных коммитах. Убедитесь, что вы действительно этого хотите - в противном случае лучше использовать новую ветку, это сохранит ваши локальные коммиты. И используйте git stash для сохранения изменения, которые еще не совершены.)


Edit: Если у вас есть только одна локальная ветвь и вы отслеживаете одну удаленную ветку, все, что вам нужно сделать, это

git pull

из рабочего каталога.

Это выберет текущую версию всех отслеживаемых удаленных веток и обновит текущую ветвь (и рабочий каталог) до текущей версии удаленной ветви, которую она отслеживает.

63 голосов
/ 23 мая 2014

Вы хотите сделать

git fetch origin
git reset --hard origin/master
git clean -f -d

Это делает ваше локальное репо точно таким же, как ваше удаленное репо.

Не забудьте заменить origin и master на удаленный и ветвь, с которой вы хотите синхронизировать.

5 голосов
/ 23 апреля 2019

Сброс и синхронизация локального репозитория с удаленной веткой

Команда: Не забудьте заменить origin и master на удаленный и ветвь, с которой вы хотите синхронизироваться.

git fetch origin && git reset --hard origin/master && git clean -f -d

Или пошагово:

git fetch origin
git reset --hard origin/master
git clean -f -d

Ваша локальная ветвь теперь является точной копией (фиксирует и все) удаленной ветки.

Вывод команды:

Вот пример запуска команды на локальном клоне репозитория Forge a git.

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$
4 голосов
/ 16 февраля 2012

(эта информация взята с Руководство пользователя Git )

Я тоже учусь, так что это может быть не совсем ответ на вопрос, но это может кому-то помочь:

  1. Когда удаленный репозиторий изначально клонирован, копии всех веток сохраняются в вашем локальном репозитории (просмотрите их с помощью git branch -r)
  2. Чтобы обновить эти копии и сделать их текущими (т.е. синхронизировать их с удаленной ветвью), используйте git fetch. Это не повлияет на существующие ветки, созданные вами.
  3. Чтобы переопределить проверку вашей локальной ветки свежей версией любой ветки, над которой вы работаете (при условии, что вы уже выполнили git add origin /path/to/repository), используйте git checkout origin/branch_name, это отменит ваши локальные изменения в ветке branch_name
3 голосов
/ 11 марта 2015

Если вы говорите о синхронизации разветвленного репо, вы можете выполнить следующие шаги:

Как синхронизировать репозиторий веток из git

  1. проверить текущую ветку git

    git branch

  2. Оформить заказ мастеру, если вы не являетесь мастером

    git checkout master

  3. Получить исходящий репозиторий, если у вас есть правильные права доступа

    git fetch upstream

  4. Если вы получаете ошибку ниже, тогда запустите

    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.
    
  5. Теперь выполните приведенную ниже команду.

    git fetch upstream

  6. Теперь, если вы являетесь мастером, объединитеupstream / master в master ветку

    git merge upstream/master

    Вот и все !!

    Перекрестная проверка с помощью команды git remote, более конкретно git remote -v

    ЕслиУ меня также есть права коммита на репозиторий в восходящем потоке, я могу создать локальную ветвь в восходящем потоке и выполнить работу, которая пойдет туда в обратном направлении.

3 голосов
/ 17 июня 2011

Звучит так, как будто вы хотите зеркало удаленного хранилища:

git clone --mirror url://to/remote.git local.git

Эта команда создает пустой репозиторий. Если вам не нужен пустой репозиторий, все становится сложнее.

0 голосов
/ 16 июня 2011

Для этого вы можете использовать git hooks . Просто создайте хук, который толкает измененный на другой репо после обновления.

Конечно, у вас могут возникнуть конфликты слияния, поэтому вам нужно придумать, как с ними справиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...