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

297

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

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

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

Axl
источник
4
Всегда, когда я прихожу сюда, я ищу Синхронизирующий форк
Мартин Тома
1
git fetch --prune
hassanzadeh.sd

Ответы:

342
git fetch --prune

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

jobwat
источник
6
Вот что я искал! PS В следующий раз я буду более внимательно читать man-страницы, прежде чем копать stackoverflow :-)
Сергей Соколенко,
5
Да, git pull -pделает то же самое - «git pull запускает git fetch с заданными параметрами и вызывает git merge для слияния найденных головок веток с текущей ветвью» - git-scm.com/docs/git-pull
jobwat
2
Используйте git fetch <remote> --prune, если кому-то нужен только --pruneконкретный пульт. например. git fetch upstream --prune,
Fery Wardiyanto
git fetch origin --pruneсинхронизировать локальное репо с вашим форком upstreamпроекта
Стюарт Кардалл
2
@SergiySokolenko, это то, что мы все говорим, но в глубине души мы знаем, что ТАК стало удобнее, чем справочные страницы :-P
Marcello Romani
144

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

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.

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

FractalSpace
источник
1
Большое спасибо за обновление отлично работает с GitHub и Bitbucket :)
CommonSenseCode
этот ответ был самым надежным решением для меня.
AlanH
95

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

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

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

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

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

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

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


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

git pull

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

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

Пауло Эберманн
источник
Если я НИЧЕГО не изменяю в своем локальном репозитории, только а.) Хочу иметь копию всего с удаленного, и б.) Хочу показать различия между версиями. Так что я НЕ фиксирую, ничего не меняю = никаких локальных обновлений / изменений. Какие команды мне следует использовать периодически (например, каждую неделю или около того) для достижения двух вышеуказанных функций? Пожалуйста, ответьте: ПОЦЕЛУЙ (Keep It Simple Stupid) - я тоже мерзавец, и OFC будет RTFM - но для начала нужна помощь. ;)
кобаме
git pullЯ думаю, в вашем простом случае этого должно быть достаточно. (Я обновил ответ.)
Paŭlo Ebermann
Что делать, если у меня есть некоторые локальные изменения, которые я не хочу совершать. Теперь, когда я делаю тягу, это говорит мне, чтобы я их передал или спрятал. Так в этом случае, как я могу сказать Git переопределить их и сделать тягу?
Харшана
89

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

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

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

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

aandis
источник
2
он также удаляет все каталоги из npm install и bower install, не рекомендуется, если вы не хотите переустанавливать все зависимости, которые находятся в .gitignore
chwagssd
Это не удаляет мой node_modules, это работает именно так, как я хочу.
Вахид Амири
ВНИМАНИЕ: удаляет неотслеживаемые файлы
Амит Ядав,
Я потерял все свои данные, используя этот код, я попытался синхронизировать свой локальный репозиторий с репозиторием git. Но это заставило мой глобальный репозиторий синхронизироваться с моим локальным репозиторием.
Захид Хан
10

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

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

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

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

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

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

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

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

Ричард Хансен
источник
3

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

Как синхронизировать репозиторий форка из 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. Теперь, если вы находитесь на master, тогда объедините upstream / master в master ветку

    git merge upstream/master

    Это оно!!

    Перекрестная проверка через git remoteкоманду, более конкретноgit remote -v

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

Нишант Упадхьяй
источник
Почему я должен делать 5.git upstream, когда я уже получаю сообщение об ошибке на третьем шаге?
Md Sifatul Islam
-2

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

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

Makis
источник