Витягніть нові оновлення з оригінального сховища GitHub у роздвоєне сховище GitHub


615

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

Як я можу внести зміни, внесені в оригіналі, та включити їх у своє сховище?


1
Можливий дублікат або, можливо, просто пов'язаний злиття між виделками в GitHub .

Якщо є додаткові теги, які ви можете синхронізувати, виконайте git push --force origin --tagsзапропоновані рішення!
MediaVince

Відповіді:


716

Ви повинні додати оригінальний сховище (той, який ви роздвояли) як віддалений.

На сторінці чоловіка вилки GitHub :

вилка

Після того, як клон буде завершений, ваш репо буде мати дистанційне ім’я " origin", яке вказує на вашу вилку на GitHub.
Не дозволяйте, щоб назва вас бентежила, це не вказує на оригінальний репо-реп, з якого ви розщелилися. Щоб допомогти вам відслідковувати цю репо, ми додамо ще один віддалений під назвою “upstream”:

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

У вас також є рубіновий камінь, який може полегшити ці операції GitHub .

роздвоєний

Дивіться також " Git fork is git clone? ".


14
Дивіться також bassistance.de/2010/06/25/git-fu-updating-your-github-fork для приємного резюме.
VonC

2
@syedrakib Я вважаю за краще git rebase upstream/master, але я додав у відповідь дві можливості.
VonC

1
@PaBLoX якщо ви роздвоєний репо, ви працюєте на вашому репо, в вашій галузі: перебазуватися і змусити поштовх: не безладдя бере участь. Навіть запит на витягнення, що виконується, буде правильно оновлений.
VonC

2
@PaBLoX ви не створюєте безлад: ви git push --force, замінюючи історію своєї філії на GitHub вашою місцевою філією, яку ви тільки що перезавантажили. Оскільки тільки ви користуєтеся сумною гілкою, жодний безлад не бере участь.
VonC

2
Я розумію. Я все ще думаю, що це важко, нетривіально і не інтуїтивно. Але все ж дивно, що мої зміни завжди будуть на вершині (останні), хоча насправді вони були внесені раніше. Розміщення, яке я розміщував раніше, виглядає краще (ще нетривіально). Проблема полягає в тому, що виконувати зміни хешей (очевидно, оскільки є новий батьківський) і створює багато шуму всередині github при виклику проблем. І все-таки мене дивує, що не існує способу залишатися оновленим за версією потоку та керувати власною вилкою, не створюючи безглуздих комісій злиття чи "брехні" про історію.
Пабло Олмос де Агілера C.

99

Окрім відповіді VonC, ви можете ще більше налаштувати її на свій смак.

Після отримання з віддаленої гілки вам все одно доведеться об'єднати коміти. Я би замінив

$ git fetch upstream

з

$ git pull upstream master

оскільки git pull по суті є git fetch + git merge.


Що робити, якщо я знаю, що гілка вище за течією не має змін до існуючих файлів, але додано лише декілька файлів ресурсів - мені все-таки потрібно об'єднання?
azec-pdx

4
Безумовно, це просто зробить перемогу в цьому випадку
Домнеса

як це зробити master upstream перезаписує всі локальні файли (щоб не виникало конфліктів злиття) master upstream в цьому випадку веде за кодом, тому ми довіряємо йому на 100% ... вдалося це зробити
snh_nl

1
@snh_nl git rebase upstream masterЗверніть увагу, що це не є безконфліктним, якщо ви достатньо відхилилися від upstream/master. Дивіться git-scm.com/docs/git-rebase (tl; dr: це важко скидає вашого місцевого господаря до того, що знаходиться вгору за течією, а потім намагається повернути всі місцеві комітети з точки розбіжності вперед)
cowbert

68

У цьому відео показано, як оновити вилку безпосередньо з GitHub

Кроки:

  1. Відкрийте свою вилку на GitHub.
  2. Натисніть на Pull Requests.
  3. Натисніть на New Pull Request. За замовчуванням GitHub порівняє оригінал із вашою виделкою, і якщо ви не зробили жодних змін, не має нічого порівняти.
  4. Натисніть на switching the base. Тепер GitHub порівняє вашу вилку з оригіналом, і ви повинні побачити всі останні зміни.
  5. Клацніть Create a pull requestдля цього порівняння і призначте передбачуване ім’я вашому запиту на витяг (наприклад, Оновити з оригіналу).
  6. Натисніть на Create pull request.
  7. Прокрутіть униз і натисніть Merge pull requestі, нарешті, Confirmз’єднайте. Якщо у вашій вилці не було змін, ви зможете автоматично її об’єднати.

3
На жаль, цей приємний графічний метод створює додатковий шум у вашій вилці, як згадувалося вище в коментарях до прийнятої відповіді. Тому рекомендується метод командного рядка: help.github.com/articles/syncing-a-fork
Джонатан Крос

Не вдалося знайти switching the baseваріант
альпер

64

Використання:

git remote add upstream ORIGINAL_REPOSITORY_URL

Це встановить ваш вихідний потік до сховища, з якого ви відключили. Потім зробіть це:

git fetch upstream      

Це отримає всі гілки, включаючи майстер з оригінального сховища.

Об’єднайте ці дані у вашій місцевій головній галузі:

git merge upstream/master

Змініть у своєму роздрібненому сховищі, тобто до походження:

git push origin master

Вуаля! Ви закінчили із синхронізацією вихідного сховища.


як один make master upstream перезаписує всі локальні файли (щоб не виникало конфліктів злиття) master upstream в цьому випадку веде за кодом, тому ми довіряємо йому на 100% ... вдалося це зробити
snh_nl

Один із способів - просто видалити локальну копію та зробити свіже клонування :)
ARK

1

Якщо ви використовуєте настільний додаток GitHub, у правому верхньому куті є кнопка синхронізації. Клацніть на ньому, а потім Update from <original repo>вгорі ліворуч.

Якщо синхронізованих змін не буде, це буде неактивним.

Ось кілька скріншотів, щоб зробити це просто.


1

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


1

Якщо ви хочете зробити це без кліпу, ви можете це зробити повністю на веб-сайті Github.

  1. Перейдіть у своє сховище виделки.
  2. Натисніть на New pull request.
  3. Не забудьте встановити свою вилку як базове сховище, а оригінал (верхнє сховище) як головне сховище. Зазвичай потрібно лише синхронізувати головну гілку.
  4. Create new pull request.
  5. Виберіть стрілку праворуч від кнопки злиття та переконайтесь, що виберіть ребазування замість злиття. Потім натисніть кнопку. Таким чином, це не призведе до непотрібних об'єднань.
  6. Зроблено.

0

Щоб автоматично синхронізувати своє роздрібнене сховище з батьківським сховищем, ви можете скористатися програмою Pull на GitHub.

Детальнішу інформацію див. У Readme .

Щодо розширених налаштувань, де ви хочете зберегти зміни, внесені до сховища роздвоєних, зверніться до моєї відповіді на подібне запитання тут .

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