Ответ 1
git fetch --prune
-p, --prune
После извлечения удалите все ветки удаленного отслеживания, которые больше не существуют на пульте дистанционного управления. параметры обрезки
Я хочу синхронизировать свой локальный репозиторий с удаленным, чтобы мой локальный репозиторий стал на 100% копией удаленного - это означает, что если определенные файлы отличаются в этих репозиториях, мы перезаписываем локальные с удаленными, и если есть файлы в локальных репозиториях, которые не существуют на удаленном компьютере, локальные файлы удаляются.
Есть ли способ достичь этого, кроме как сделать свежий клон удаленного хранилища?
Подобный вопрос, как Синхронизация локального репозитория Git с удаленным в один выстрел, отбрасывая локальные изменения/коммиты.
git fetch --prune
-p, --prune
После извлечения удалите все ветки удаленного отслеживания, которые больше не существуют на пульте дистанционного управления. параметры обрезки
Эти шаги сделают это:
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.
Хотя ваши локальные коммиты и изменения исчезнут из виду после этого, при необходимости можно восстановить совершенные изменения.
Вам нужно понять, что репозиторий Git - это не просто дерево каталогов и файлов, но также хранит историю этих деревьев, которая может содержать ветки и слияния.
При извлечении из репозитория вы скопируете все или некоторые из ветвей в ваш репозиторий. Они затем находятся в вашем репозитории как "ветки удаленного отслеживания", например. ветки, названные как remotes/origin/master
или такие.
Получение новых коммитов из удаленного репозитория ничего не изменит о вашей локальной рабочей копии.
Ваша рабочая копия обычно имеет фиксацию, называемую HEAD
. Эта фиксация обычно является концом одного из ваших локальных ветвей.
Я думаю, что вы хотите обновить локальную ветку (или, возможно, все локальные ветки?), в соответствующую удаленную ветвь, а затем проверить последнюю ветвь.
Чтобы избежать конфликтов с вашей рабочей копией (которые могут иметь локальные изменения), вы сначала очищаете все, что не является версией (используя git clean
). Затем вы проверяете местную ветку, соответствующую удаленной ветке, которую хотите обновить, и используйте git reset
, чтобы переключить ее на выбранную удаленную ветвь. (git pull
будет включать все обновления удаленной ветки в вашем локальном, что может сделать то же самое, или создать комманду слияния, если у вас есть локальные коммиты.)
(Но тогда вы действительно потеряете любые локальные изменения - как в рабочей копии, так и в локальных коммитах. Убедитесь, что вы действительно этого хотите, иначе лучше использовать новую ветку, это экономит ваши локальные коммиты. И используйте git stash
для сохранения изменения, которые еще не совершены.)
Edit: Если у вас есть только одна локальная ветвь и отслеживается одна удаленная ветвь, все, что вам нужно сделать, это
git pull
из рабочего каталога.
Это позволит получить текущую версию всех отслеживаемых удаленных веток и обновить текущую ветку (и рабочий каталог) до текущей версии удаленной ветки, которую она отслеживает.
Вы хотите сделать
git fetch --prune origin
git reset --hard origin/master
git clean -f -d
Это делает ваше локальное репо точно таким же, как ваше удаленное репо.
Не забудьте заменить origin и master на удаленный и ветвь, с которой вы хотите синхронизироваться.
Сброс и синхронизация локального репозитория с удаленной веткой
Команда: Не забудьте заменить 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$
(Эта информация от Руководство пользователя Git)
Я тоже участвую, поэтому это может быть не совсем ответ на вопрос, но он может помочь кому-то:
git branch -r
)git fetch
. Это не повлияет на любые существующие вами настраиваемые ветки.git add origin /path/to/repository
), используйте git checkout origin/branch_name
, это переопределит ваши изменения локальных жителей в ветке branch_name
Похоже, вы хотите зеркало удаленного репозитория:
git clone --mirror url://to/remote.git local.git
Эта команда создает пустой репозиторий. Если вам не нужен голый репозиторий, все усложняется.
Если вы говорите об синхронизации разветвленного репо, вы можете выполнить следующие шаги.
Как синхронизировать репозиторий 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
Если у меня также есть права на восходящее репо, я могу создать локальную ветвь вверх и выполнить работу, которая будет идти вверх по течению там.
Вы можете использовать git hooks для этого. Просто создайте крючок, который подталкивает к другому репо после обновления.
Конечно, вы можете столкнуться с конфликтами слияния, поэтому вам нужно понять, как с ними бороться.