Синхронізація локального сховища Git із віддаленим


297

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

Чи є якийсь спосіб досягти цього, крім того, як зробити свіжий клон віддаленого сховища?

Аналогічне запитання як Sync local git repo з дистанційним в одному кадрі, відкидаючи локальні зміни / комісії .


4
Завжди, коли я приїжджаю сюди, шукаю синхронізацію виделки
Мартін Тома

1
git fetch --prune
hassanzadeh.sd

Відповіді:


342
git fetch --prune

-p, --prune
Після вилучення видаліть усі гілки віддаленого відстеження, яких більше немає на віддаленому. варіанти чорносливу


6
Ось що я шукав! PS Наступного разу я більш уважно прочитаю чоловічі сторінки, перш ніж викопати stackoverflow :-)
Сергій Соколенко,

5
Так, git pull -pчи те саме - 'git pull run 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проектом проекту
Stuart Cardall

2
@SergiySokolenko - це те, що ми всі говоримо, але в глибині душі ми знаємо, що SO стало зручнішим, ніж сторінки чоловіка :-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.

Хоча ваші місцеві зобов’язання та зміни зникнуть з поля зору після цього, можливо, відновити здійснені зміни, якщо це необхідно.


1
велике спасибі за оновлення, прекрасно працює з github та bitbucket :)
CommonSenseCode

ця відповідь була для мене найбільш надійним рішенням.
АланH

95

Вам потрібно зрозуміти, що сховище Git - це не лише дерево каталогів та файлів, але також зберігає історію цих дерев - які можуть містити гілки та злиття.

Під час отримання даних із сховища ви скопіюєте всі або деякі гілки там у ваше сховище. Потім вони знаходяться у вашому сховищі як "гілки віддаленого відстеження", наприклад, гілки, названі таким remotes/origin/masterчи подібним.

Отримання нових комісій із віддаленого сховища нічого не змінить у вашій місцевій робочій копії.

У вашій робочій копії зазвичай комісія перевіряється, називається HEAD. Ця фіксація зазвичай є підказкою одного з ваших місцевих відділень.

Я думаю, ви хочете оновити своє місцеве відділення (чи, можливо, всі локальні гілки?) До відповідної віддаленої гілки, а потім перевірити останню гілку.

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

(Тоді ви дійсно втратите всі локальні зміни - як в робочій копії, так і в локальних комісіях. Переконайтеся, що цього ви дійсно хочете - інакше краще скористайтеся новою гілкою, це збереже ваші місцеві зобов’язання. І використовуйте git stashдля збереження змін, які ще не здійснені .)


Редагувати: Якщо у вас є лише одна локальна гілка і ви відстежуєте одну віддалену гілку, все, що вам потрібно зробити, - це

git pull

зсередини робочого каталогу.

Це отримає поточну версію всіх відстежених віддалених гілок та оновить поточну гілку (та робочу директорію) до поточної версії віддаленої гілки, яку вона відстежує.


Якщо я міняю НІЩО у своєму локальному сховищі, лише a.) Хочу мати копію всього з віддаленого пристрою, і b.) Хочу, щоб можливість відображення відрізнялася між версіями. Тож я НЕ здійснюю, не змінюючи нічого = немає локальних оновлень / змін. Які команди я повинен періодично використовувати (наприклад, щотижня або близько того) для досягнення вищезазначених двох функцій? Відповідь, будь ласка, відповідь KISS (Keep It Simple Stupid) - я теж git noob, і часто буде RTFM - але для початку потрібна допомога. ;)
kobame

У вашому простому випадку git pull, я думаю, буде достатньо. (Я оновив відповідь.)
Paŭlo Ebermann

що робити, якщо у мене є місцеві зміни, які я не хочу вчинити. Тепер, коли я роблю тягнення, він каже, що я їх зроблю або приховую. Тож у цьому випадку як я можу сказати git, щоб перемогти їх і зробити тягнути?
Харшана

89

Ви хочете зробити

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

Це робить ваше місцеве репо так само, як ваше віддалене репо.

Не забудьте замінити походження та master на віддалений та гілку, з якою ви хочете синхронізувати.


2
він також видаляє всі каталоги з npm install та bower install, не рекомендується, якщо ви не хочете перевстановити всі залежності, які є у .gitignore
chwagssd

Це не видалило моє node_modules, воно працює саме так, як я хочу.
Вахід Амірі

ПОПЕРЕДЖЕННЯ. У ньому видалено незатребувані файли
Аміт Ядав

Я втратив усі свої дані за допомогою цього коду, я намагався синхронізувати своє локальне сховище із сховищем git. Але це змусило мій глобальний сховище синхронізуватися з моїм локальним сховищем.
Захід Хан

10

Скидання та синхронізація локального сховища з віддаленою гілкою

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

3

Здається, що потрібно дзеркало віддаленого сховища:

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

Ця команда створює голий сховище. Якщо ви не хочете оголеного сховища, все ускладнюється.


3

Якщо ви говорите про синхронізацію роздвоєного репо, тоді ви можете виконати ці кроки.

Як синхронізувати сховище fork від 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. Тепер, якщо ви перебуваєте на майстер, тоді об'єднайте верхню / поточну в головну гілку

    git merge upstream/master

    Це воно!!

    Перехресна перевірка за допомогою git remoteкоманди, більш конкретнаgit remote -v

    Якщо я також маю права на виконання репо-версії за течією, я можу створити локальну гілку вище за течією та виконати роботу, яка буде йти там вище за течією.


Чому я повинен робити 5.git за течією, коли я вже отримую помилку на третьому кроці?
Md Sifatul Іслам

-2

Для цього можна використовувати гакі . Просто створіть гачок, який після оновлення зміниться до іншого репо.

Звичайно, у вас можуть виникнути конфлікти злиття, тож ви повинні вирішити, як з ними боротися.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.