Синхронизация локального репозитория Git с удаленным

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

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

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

Ответ 1

git fetch --prune

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

Ответ 2

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

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.

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

Ответ 3

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

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

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

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

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

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

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


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

git pull

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Команда: Не забудьте заменить 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$

Ответ 6

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

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

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

Ответ 7

Похоже, вы хотите зеркало удаленного репозитория:

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

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

Ответ 8

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

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

  • проверьте текущую ветвь git

    git branch

  • проверка, если вы не находитесь на главном

    git checkout master

  • Извлеките восходящий репозиторий, если у вас есть правильные права доступа

    git fetch upstream

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

    git remote add upstream [email protected]: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

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

Ответ 9

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

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