Питання Як оновити сховище GitHub?


Нещодавно я розгорнув проект і застосував кілька виправлень. Потім я створив запит тягнути, який потім був прийнятий.

Через кілька днів інша зміна зробила інший вкладник. Отже, моя вилка не містить цієї зміни.

Як я можу отримати цю зміну у мою вилку? Чи потрібно мені видаляти і відтворювати мою вилку, коли мені потрібно внести подальші зміни? Чи є кнопка оновлення?


2834
2017-08-30 13:53


походження


Це також можна зробити з інтерфейсу github. Я хотів би дати кредит [на цей інший плакат] [1]. [1]: stackoverflow.com/a/21131381/728141 - Mike Schroll
Ще один хороший пост в блозі - Зберігання вилки GitHub оновлено - Arup Rakshit
Знайдено це в довідкових статтях Github: help.github.com/articles/syncing-a-fork - Pranav
Це дублікат stackoverflow.com/questions/3903817/... ? - David Cary
Ось демонстрація відео, що робить це за допомогою двох облікових записів github youtube.com/watch?v=kpE0gTX4ycE - lifebalance


Відповіді:


У вашому локальному клоні вашої складної сховища ви можете додати оригінальний сховище GitHub як "пульт". ("Remotes" - це як псевдоніми для URL-адрес сховищ - origin це один, наприклад.) Тоді ви можете витягнути всі гілки з цього потокового сховища і переробити вашу роботу, щоб продовжувати працювати над версією вище. З точки зору команд, які можуть виглядати так:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

Якщо ви не хочете переписати історію вашої майстерної гілки (наприклад, через те, що інші люди могли її клонувати), то вам слід замінити останню команду з git merge upstream/master. Однак для того, щоб робити подальші запити на тлі, які є максимально чистими, це, мабуть, краще переробити.


Якщо ви перетворили свою гілку на upstream/master вам може знадобитися примусити натиснути, щоб натиснути його на свій власний витягнутий сховище на GitHub. Ви зробите це з:

git push -f origin master

Вам потрібно лише скористатись -f вперше після того, як ви перебудували.


3103
2017-08-30 14:01



Оскільки ваша вилка існує лише на github, і github не має засобів для злиття через веб-інтерфейс, то правильною відповіддю є локальне злиття вгору за потоком та відновлення змін у вашій формі. - Tim Keating
Ось чудовий посібник, який я знайшов при роботі з github: gun.io/blog/how-to-github-fork-branch-and-pull-request - Tim Keating
Негайно зауважте, що замість того, щоб перезавантажити власну гілку, щоб переконатись, що ви починаєте з чистого стану, ви, мабуть, повинні працювати в окремій гілці та подати запит на тягнення. Це змушує вашого майстра чистим для майбутніх злиттів, і це зупинить вас від необхідності переписувати історію з -f який збиває всіх, хто міг би клонувати вашу версію. - Mateusz Kowalczyk
Замість команди rebase я використовував наступне: git merge --no-ff upstream/master Таким чином, ваші зобов'язання не є на вершині більше. - Steckdoserich
Інша помилка Git. Якщо ці інструменти повинні підтримувати розподілену співпрацю, то чому так важко виконати основний робочий процес? 4 мільйони людей та 2200 upvotes означають, що інструмент не працює. "ви можете додати оригінальний сховище GitHub як" пульт " - Навіщо це робити? Чому це не відбувається під час вилки? Що таке розбите на цьому інструменті? - jww


Починаючи з травня 2014 року, можна оновити вилку безпосередньо з GitHub. Це все ще працює на вересень 2017 року. БЕЗ це призведе до брудної історії виконання.

  1. Відкрийте свою вилку на GitHub.
  2. Натисніть на Витягніть запити.
  3. Натисніть на Новий витягнутий запит. За замовчуванням GitHub порівнює оригінал зі своєю вилкою, і нічого не можна порівняти, якщо ви не внесли жодних змін.
  4. Натисніть перемикання бази якщо ви бачите це посилання. В іншому випадку встановіть вручну основна вилка спуститися до вилки, а також голова вилка до потоку. Тепер GitHub порівнює ваш вилку з оригіналом, і ви повинні побачити всі останні зміни. enter image description here
  5. Створити запит на вилучення і призначити передбачувану назву для вашого запиту тяга (наприклад, Update from original)
  6. Прокрутіть униз до Злиття запиту на вилучення, але ще не натискайте що-небудь ще.

Тепер у вас є три варіанти, але кожен з них призведе до більш чистої історії помилок.

  1. За замовчуванням буде створено потворне з'єднання.
  2. Якщо ви натиснете спадне меню і виберете "Сквош і злиття", всі втручаючі зобов'язання будуть розбиті на один. Найчастіше це те, чого ти не хочеш.
  3. Якщо натиснути Перебазируйте і об'єднайте, всі зобов'язання будуть зроблені "разом" з вами, оригінальні PR зв'язуються з вашим PR, а GitHub відображатиметься This branch is X commits ahead, Y commits behind <original fork>.

Так, так, ви можете зберегти свій репо на своєму поточному рівні, використовуючи веб-інтерфейс GitHub, але це зробить вашу історію виконання. Дотримуватися командний рядок замість цього - це просто.


642
2018-05-25 07:31



Це чудово працювало один раз. Другий раз цей процес не працював однаково: посилання "Переключення бази" не з'явилося. І коли я натиснув кнопку "Натисніть, щоб створити запит тягнути", він створив PR на репо джерела SOURCE. НЕ що я хотів .. - javadba
Все ще працює (Marchi 2015), хоча посилання "Switching the base" більше не існує. Ви повинні змінити випадаюче вікно "База", так що обидва пункти на ваш вилку, а потім ви отримаєте запит на "Порівняння через репо", який приведе вас туди, де ви хочете. - mluisbrown
Квітень 2015 р. Працює. Дякую. Я отримав "Перехід на базу". Однак, крок 6 був "Створити запит тягнути" -> Введіть коментар -> "Створити запит тягнути". Закінчимо 1 впровадження оригіналу. - cartland
@cartland (або інші) - так, він говорить: "Ця гілка - це впроваджене 1 ..." Це чимось турбуватися? Чи можна позбутися цього повідомлення? - RenniePet
Would not it be better, з простою кнопкою оновлення або синхронізації! - transformer


Ось офіційний документ GitHub на Синхронізація вилки:

Синхронізація вилки

Налаштування

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

Порада. Синхронізація вилки лише оновлює вашу локальну копію сховища; він не оновлює ваш репозиторій на GitHub.

$ git remote -v
# List the current remotes
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
origin    https://github.com/user/repo.git (fetch)
origin    https://github.com/user/repo.git (push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (push)

Синхронізація

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

Прибуток

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

$ git fetch upstream
# Grab the upstream remote's branches
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

Тепер у нас є майстер гілки верхнього потоку, який зберігається у місцевому відділенні, вгорі потоку / магістра

$ git branch -va
# List all local and remote-tracking branches
* master                  a422352 My local commit
  remotes/origin/HEAD     -> origin/master
  remotes/origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

Злиття

Тепер, коли ми придбали сховище вхідного потоку, ми хочемо об'єднати його зміни в нашу місцеву гілку. Це призведе до того, що філія буде синхронізована з висхідним потоком, не втрачаючи місцевих змін.

$ git checkout master
# Check out our local master branch
Switched to branch 'master'

$ git merge upstream/master
# Merge upstream's master into our own
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

Якщо у вашому місцевому відділі не було ніяких унікальних зобов'язань, git замість цього виконуватиме "швидкий перехід":

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Порада. Якщо ви хочете оновити своє сховище в GitHub, дотримуйтесь інструкцій тут


365
2017-10-21 23:04



Це оновлює мою локальну вилку, але моя вилка на Github.com як і раніше говорить "43 робить позаду". Мені довелося скористатися технікою лобзика, щоб створити спробу тягнути себе, щоб з'єднати головного редактора з моїм гілкою Github.com. - Michael McGinnis
@MichaelMcGinnis Після об'єднання локально, вам доведеться натискати ваші зміни на github. git push origin master - jumpnett
Може бути розумним, щоб поштовх з --follow-tags: stackoverflow.com/a/26438076/667847 - kenny
Я повинен це робити для всіх галузей окремо git merge upstream/master, а потім перевірити, щоб розвинути гілку і зробити git merge upstream/develop - Shobi P P
stackoverflow.com/a/14074925/470749 Мені було корисно, тому що я отримував Permission denied (publickey). fatal: Could not read from remote repository. коли намагаються витягнути з облікового запису Facebook Github вгору. - Ryan


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

  1. Змініть каталог у місцевий репозиторій.

    • Переключись на майстер гілку, якщо ви не є git checkout master
  2. Додайте батьківство до віддаленого сховища git remote add upstream <repo-location>

  3. Проблема git fetch upstream
  4. Проблема git rebase upstream/master

    • На цьому етапі ви перевіряєте, що зобов'язує те, що буде об'єднано, набравши git status
  5. Проблема git push origin master

Для отримання додаткової інформації про ці команди, див крок 3.


81
2017-08-05 14:59



@ МТ: Де ви вводите ці команди, хоча? Суть питання, як я це розумію, полягає в тому, як синхронізувати ваш особистий GitHub вилка з основним проектом, і роби це все з GitHub. Іншими словами, як ви можете оновити дистанційну вилку без локальний сховище? - John Y
@JohnY Використання GitHub завжди створюватиме додаткову фіксування. Вам потрібно зробити все це в оболонці на місцевому репо, щоб уникнути додаткової фіксації. - Jonathan Cross


З листопада 2013 року неочікуваний запит про функцію було відкрито за допомогою GitHub, щоб попросити їх додати дуже простий та інтуїтивно зрозумілий спосіб зберегти локальний вилка в синхронізації з поточним потоком:

https://github.com/isaacs/github/issues/121

Примітка. Оскільки запит на функцію є неофіційним, доцільно зв'язатися з ним support@github.com щоб додати вашу підтримку такої функції, як це буде реалізовано. Неофіційний запит про функцію, описаний вище, може бути використаний як доказ того, що сума інтересу до цього впроваджується.


39
2018-02-21 10:42





Передмова: Ваша вилка є "походженням", а сховище, яке ви витягли, - "висхідний".

Давайте припустимо, що ви клонули вже свою вилку на ваш комп'ютер за допомогою такої команди:

git clone git@github.com:your_name/project_name.git
cd project_name

Якщо це дано, то вам потрібно продовжувати в такому порядку:

  1. Додайте "верхній потік" до вашого клонованого сховища ("походження"):

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. Отримайте зобов'язання (та відділення) від "upstream":

    git fetch upstream
    
  3. Переключись на "майстер" гілку вашої вилки ("походження"):

    git checkout master
    
  4. Усуньте зміни в гілці "майстер":

    git stash
    
  5. З'єднайте зміни з "головної" гілки "upstream" у вашу "майстер" гілку вашого "походження":

    git merge upstream/master
    
  6. Вирішити конфлікти злиття, якщо такі є, і здійснити злиття

    git commit -am "Merged from upstream"
    
  7. Натисніть зміни у вилку

    git push
    
  8. Отримайте зміни, які було припинено (якщо такі є)

    git stash pop
    
  9. Ти закінчиш! Вітаю!

GitHub також містить інструкції по цій темі: Синхронізація вилки


29
2018-03-16 12:24



Частково допомагав: є git remote add upstream git@github.com:original_author/project_name.git просто псевдонім для git remote add upstream https://github.com/original_author/project_name.git ? - Wolf
Вовк, гадаючи, що ви знаєте це зараз, але для потомків ... Це формат для ssh. help.github.com/articles/configuring-a-remote-for-a-fork - Brad Ellis


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

З місцевого клону вашої вилки створіть свій пульт дистанційного керування. Вам потрібно лише зробити це один раз:

git remote add upstream https://github.com/whoever/whatever.git

Тоді, коли ви хочете наздогнати магістерську гілку потокового сховища, потрібно:

git checkout master
git pull upstream master

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

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


22
2018-01-03 16:59





На дату цієї відповіді GitHub не має (чи я більше не скажу?) цю функцію в веб-інтерфейсі. Ти можеш, однак, запитати support@github.com щоб додати свій голос за це.

Тим часом, користувач GitHub користувач bardiharborow створив інструмент для цього: https://upriver.github.io/

Джерело тут: https://github.com/upriver/upriver.github.io


21
2017-09-14 14:22



Хоча я знаходжу інструмент гарною ідеєю, реальність - це БРОКЕН. Вона завантажила всього 20 репо з мого облікового запису та навіть переспрямує нижній колонтитул на веб-сайт, який не існує. Якщо це буде зафіксовано, я буду великим адвокатом. - sorin
На сьогоднішній день я успішно використовую upriver для синхронізації вилки з репо, що працює вгору, тому він працює для моїх цілей, і я продовжу використовувати його. - NauticalMile
@sorin Ці 20 репо / гілок обмеження (швидше, це зараз 30) походить від настройок пейджинга GitHub за умовчанням. Для цього необхідно виконати певні адаптації до коду. - Andreas


Якщо ви використовуєте GitHub для Windows, то тепер вони мають функцію одним клацанням, щоб оновити вилки:

  1. Виберіть сховище в інтерфейсі користувача.
  2. Натисніть кнопку "Оновити від користувача / філія" зверху.

12
2018-03-31 21:45



Це також працює в Github для Mac. - Steve Moser


Дотримуйтесь нижченаведених кроків. Я спробував їх, і це мені допомогло.

Оформити замовлення на свою філію

Синтаксис: гітарний відділ yourdevelopmentbranch
Приклад: майстер вивізного квитка

Витягніть гілку репозиторію джерела для отримання останнього коду

Синтаксис: гіт тягнути https://github.com/tastejs/awesome-app-ideas магістр
Приклад: гіт тягнути https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git НАЗВА ГІЛКИ


8
2018-01-15 12:31



Якщо ви використовуєте GitHub, ви також можете натискати свої зміни на гілку GitHub. git push HttpsForYourForkOfTheRepo BRANCH_NAME - user3731622
Це чудово. Найпростіше і найчистіше рішення. - JakeGould


Насправді, у вашому вилку можна створити гілку з будь-якого зобов'язання вгорі потоку в браузері:

  • ВІДЧИНЕНО https://github.com/<repo>/commits/<hash>, де репо Ваша вилка, і хеш це повна хеш коректної дії, яку ви можете знайти у веб-інтерфейсі вище. Наприклад, я можу відкрити https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990, що вказує на linux  master як час написання
  • Натисніть кнопку "Дерево: ....".
  • Введіть назву нової гілки та натисніть Введіть

Enter image description here

Потім ви можете отримати цю галузь до вашого місцевого клону, і вам не доведеться віддавати ці дані назад до GitHub, коли ви натискаєте редагування на вершині цієї фіксації. Або скористайтеся веб-інтерфейсом, щоб змінити щось у цій галузі.

Як це працює (це здогадка, я не знаю, як точно GitHub робить це): forks обмінюються об'єктами зберігання та використання простір імен відокремити посилання користувачів. Таким чином, ви можете отримати доступ до всіх зобов'язань через вашу вилку, навіть якщо вони не існували до моменту вилучення.


8
2018-01-18 06:41



Це чудово! Це дозволяє уникнути абсолютно безглуздого завантаження цих зобов'язань github. - Rotsor