Как обновить или синхронизировать разветвленный репозиторий на GitHub?

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

Как я могу внести это изменение в свою вилку? Нужно ли мне удалять и заново создавать свою вилку, когда мне нужно внести дополнительные изменения? Или есть кнопка обновления?


person Lea Hayes    schedule 30.08.2011    source источник
comment
Это также можно сделать из пользовательского интерфейса github. Я хотел бы воздать должное [этому другому автору] [1]. [1]: stackoverflow.com/a/21131381/728141   -  person Mike Schroll    schedule 20.02.2014
comment
Еще одно хорошее сообщение в блоге по этому поводу - Обновление форка GitHub   -  person Arup Rakshit    schedule 15.10.2014
comment
Нашел это в справочных статьях Github: help.github.com/articles/syncing-a- вилка   -  person Pranav    schedule 02.04.2015
comment
Это дубликат stackoverflow.com/questions/3903817/?   -  person David Cary    schedule 29.08.2015
comment
Вот видео-демонстрация, в которой это делается с использованием двух учетных записей github youtube.com/watch?v=kpE0gTX4ycE   -  person lifebalance    schedule 03.06.2016
comment
Вот и все - github.com/KirstieJane/STEMMRoleModels/wiki/. Просто и легко   -  person Sumeet Patil    schedule 18.03.2020
comment
Найдите решение Ильича (внизу страницы)   -  person Stack The User    schedule 23.03.2021
comment
С мая 2021 года это возможно напрямую из пользовательского интерфейса GitHub без дополнительного запроса на перенос, см. журнал изменений и stackoverflow.com/a/ 67425996   -  person Marcono1234    schedule 08.05.2021


Ответы (30)


В вашем локальном клоне вашего разветвленного репозитория вы можете добавить исходный репозиторий GitHub в качестве удаленного. (Пульты похожи на псевдонимы для 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

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 только в первый раз после того, как вы переустановили.

person Mark Longair    schedule 30.08.2011
comment
Я поставил +1 на этот ответ, потому что он, вероятно, выполняет то, что действительно нужно автору вопроса. Но я нахожусь в той же ситуации, и мне любопытно: есть ли способ на самом деле вытащить из основного репо в мою вилку? Или ветвь восходящего потока будет обновлена ​​только в том случае, если я вернусь к нему после получения из восходящего потока? - person todd.pierzina; 24.05.2012
comment
Поскольку ваша вилка существует только на github, а github не имеет инструментов для выполнения слияний через веб-интерфейс, то правильный ответ - выполнить слияние восходящего потока локально и отправить изменения обратно в вилку. - person Tim Keating; 19.06.2012
comment
Вот отличный учебник, который я нашел по работе с github: gun.io/blog/how-to-github-fork-branch-and-pull-request - person Tim Keating; 19.06.2012
comment
@TimKeating У Github есть веб-интерфейс для работы с слияниями из других запросов на вытягивание. Мне интересно, что произойдет, если я обменяю пункт назначения и свое репо при отправке запроса на перенос. - person yehe; 19.03.2013
comment
Небольшое замечание: вместо того, чтобы перебазировать собственную главную ветку, чтобы убедиться, что вы начинаете с чистого состояния, вам, вероятно, следует поработать с отдельной веткой и сделать из нее запрос на перенос. Это сохраняет ваш мастер в чистоте для любых будущих слияний и избавляет вас от необходимости переписывать историю с помощью -f, что сбивает с толку всех, кто мог клонировать вашу версию. - person Mateusz Kowalczyk; 30.05.2013
comment
После того, как ваши изменения будут приняты в апстриме, вам нужно повторить эти шаги: git fetch upstream; git rebase upstream/master; git push origin master - person rubo77; 16.10.2013
comment
@episodeyang: Я не возражаю против изменения URL-адреса примера с git:// на https://, но ваш комментарий в конце был неправильным - протокол git по-прежнему отлично работает с GitHub; Я подозреваю, что вы пытались из сети, которая блокирует трафик на порт 9418 или что-то подобное. Я удалил эту часть вашего редактирования. - person Mark Longair; 31.12.2013
comment
Если у вас есть локальные коммиты, разве это не создает уродливых "Merge branch 'master' of github.com:user/repo" коммитов каждый раз, когда вы пытаетесь получить обновления из апстрима? Конечно, вы можете перебазировать, но если вы нажали свои изменения в своем разветвленном репо на github, это означает, что в следующий раз вы просто не сможете выполнить ребазирование без регенерации хэшей для каждого коммита после того, как он все превратит в беспорядок. Я действительно не знаю, как правильно поддерживать форк на github. - person Pablo Olmos de Aguilera C.; 12.01.2014
comment
Если вы хотите иметь исходное репо локально и при этом хотите обновить свою вилку, вы можете добавить свою вилку как downstream пульт, как описано выше, а затем нажать на нее: git push -f downstream. - person Alfred Xing; 10.05.2014
comment
это лучше, чем помощь github, здесь который не настраивается вверх по течению. - person dashesy; 19.02.2015
comment
@MarkLongair, что здесь означает воспроизведение поверх другой ветки? - person crisron; 29.11.2015
comment
@crisron: хороший момент - это не совсем понятно. Перебазирование будет смотреть на изменение (патч), которое было внесено каждым коммитом в его исходную точку в истории, и пытаться применить это изменение к другому родительскому коммиту (сохраняя то же сообщение и информацию об авторе). Иногда это не применимо чисто, и вам нужно устранять конфликты. Итак, что я имел в виду, когда ваши коммиты воспроизводились поверх этой другой ветки, я брал все ваши новые коммиты, которых нет в этой ветке, и пытался воссоздать их один за другим, делая те же изменения, что и они. по отношению к их первоначальному родителю. - person Mark Longair; 04.12.2015
comment
Вероятно, было бы проще и быстрее, если бы можно было просто удалить и заново разветвить. - person Akshay Damle; 14.07.2016
comment
Вместо команды rebase я использовал следующее: git merge --no-ff upstream/master Таким образом, ваши коммиты больше не на вершине. - person Steckdoserich; 17.10.2016
comment
@Steckdoserich не мог с этим согласиться. Крайне грустно, что люди здесь думают, что принудительное продвижение общедоступной ветки после перебазирования является отдаленно правильным или приемлемым. Это делает вашу вилку практически бесполезной для всех, кто будет следовать за ней .... - person UpAndAdam; 13.01.2017
comment
Очередной сбой Git. Если предполагается, что эти инструменты поддерживают распределенное сотрудничество, то почему так сложно выполнить базовый рабочий процесс? 4 миллиона человек и 2200 голосов «за» означают, что инструмент вышел из строя. вы можете добавить исходный репозиторий GitHub в качестве удаленного - зачем вообще это нужно делать? Почему этого не делают во время вилки? Что такого сломанного в этом инструменте? - person jww; 16.04.2017
comment
@jww: Вы спрашиваете, почему Git нужно сообщить об исходном репозитории GitHub. Это потому, что Git - это децентрализованная система управления версиями, которая никак не связана с GitHub; вероятно, очевидно, что Git был создан до GitHub. Когда вы создаете разветвленный репозиторий на GitHub и клонируете его, GitHub знает, что репозиторий является вилкой; У Git нет причин для этого, и нет. (Почему клон не копирует пульты Git? Git децентрализован; разные люди захотят разные пульты; это не имеет смысла.) См. github.com/github/hub для интеграции GitHub в Git. - person Radon Rosborough; 04.06.2017
comment
@Radon развивает концепцию GitHub, представленную сайтом, а не самим Git? - person Sinjai; 09.02.2018
comment
@Sinjai Да. Отдельные копии репозитория Git не связаны друг с другом, кроме той, которая существует в вашем уме или во внешних службах, таких как GitHub (или которую вы неявно создаете, создавая пульты). - person Radon Rosborough; 09.02.2018
comment
@RadonRosborough Несомненно, мысль о создании производных проектов с открытым исходным кодом рассматривалась кем-то еще до таких сайтов, как GitHub, не так ли? Хотя я полагаю, что Git не имеет ничего общего с открытым исходным кодом. - person Sinjai; 09.02.2018
comment
@Sinjai Да, конечно. Вот почему Git имеет явную поддержку либо применения патчей из изменений других людей, либо слияния коммитов непосредственно из репозиториев других людей (и это делает этот последний шаг чрезвычайно простым благодаря поддержке сохраненного списка пультов). То, что Git не делает, - это хостинг централизованного веб-сервиса для размещения репозиториев в стандартизированной реляционной структуре. Думаю, должно быть очевидно, почему последнее выходит за рамки Git. И именно поэтому существует GitHub. И GitLab. И Bitbucket. И т.п. - person Radon Rosborough; 11.02.2018
comment
@RadonRosborough Конечно, кажется, что должна быть явная поддержка для этих веб-сервисов. Не то чтобы Git ограничивал свою поддержку только GitHub или BitBucket. Это распространенный вариант использования, который более запутан в применении, чем должен быть. Хотя я полагаю, что в двух словах это Git. - person Sinjai; 11.02.2018
comment
@Sinjai Существует есть явная поддержка этих веб-сервисов. Это называется удаленной системой. Вы указываете URL-адрес, а затем нажимаете / вытягиваете. Говоря буквально, я не думаю, что это могло бы стать проще без поддержки жесткого кодирования для какой-то конкретной службы. Если бы Git имел какое-то неявное понимание взаимосвязи между различными репозиториями без вашего предоставления этой информации, ему потребовалась бы централизованная база данных. Просто нет рационального способа интегрировать эту функциональность в распределенную систему контроля версий. - person Radon Rosborough; 11.02.2018
comment
Git настолько децентрализован, что вы можете объединить ветку из репо, размещенного на вашем локальном компьютере, без доступа к Интернету, затем объединить ее с веткой другого репо, размещенного на GitLab, и, наконец, перенастроить все это в другое репо, размещенное на GitHub. - person Bruno Finger; 14.11.2018
comment
что, если после git rebase upstream/master возникнут конфликты? как разрешить конфликт? - person DennisLi; 28.03.2020
comment
@jww нет проблем с SVN, вы всегда можете переключиться на него. - person 0andriy; 12.08.2020
comment
Это было полезно. Не удалось найти инструкции по настройке восходящего потока в официальных документах git здесь - person Rahul Tiwari; 10.06.2021
comment
Заставляет меня задуматься, есть ли у нас что-то лучшее от git в 2021 году, чем ручное добавление, извлечение восходящего потока и перебазирование восходящего / главного потока? - person Rahul Tiwari; 10.06.2021
comment
«Главная» ветвь теперь изменена на «главную»? - person Pradeepsf729; 19.06.2021

С мая 2014 года появилась возможность обновлять форк прямо с GitHub. Это все еще работает по состоянию на сентябрь 2017 года, НО это приведет к грязной истории коммитов.

  1. Откройте свою вилку на GitHub.
  2. Щелкните Pull Requests.
  3. Щелкните New Pull Request. По умолчанию GitHub сравнивает оригинал с вашей вилкой, и сравнивать нечего, если вы не вносили никаких изменений.
  4. Если вы видите эту ссылку, нажмите переключение базы. В противном случае вручную установите раскрывающийся список base fork на свой форк, а head fork на восходящий поток. Теперь GitHub сравнит ваш форк с оригиналом, и вы должны увидеть все последние изменения. введите описание изображения здесь
  5. Создайте пул-реквест и присвойте предсказуемое имя вашему пул-реквесту (например, Update from original).
  6. Прокрутите вниз до Merge pull request, но пока ничего не нажимайте.

Теперь у вас есть три варианта, но каждый из них приведет к не совсем чистой истории коммитов.

  1. По умолчанию создается уродливая фиксация слияния.
  2. Если вы щелкните раскрывающийся список и выберите «Сжать и объединить», все промежуточные коммиты будут объединены в один. Чаще всего это то, чего вы не хотите.
  3. Если вы нажмете Rebase and merge, все коммиты будут сделаны «с вами», исходные PR будут ссылаться на ваш PR, и GitHub отобразит This branch is X commits ahead, Y commits behind <original fork>.

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

person lobzik    schedule 25.05.2014
comment
Один раз это сработало. Во второй раз этот процесс не работал по-другому: не отображалось переключение базовой ссылки. И когда я нажимаю Click, чтобы создать запрос на перенос, он создал PR в репозитории SOURCE. НЕ то, что я хотел .. - person WestCoastProjects; 21.08.2014
comment
По-прежнему работает (март 2015 г.), хотя переключение базовой ссылки больше нет. Вам нужно изменить раскрывающийся список Base, чтобы оба указывали на вашу вилку, а затем вы получили запрос на сравнение репозиториев, который приведет вас туда, где вы хотите. - person mluisbrown; 04.03.2015
comment
Апрель 2015. Работает. Спасибо. Я получил Переключение на базу. Однако шаг 6 был «Создать запрос на перенос» - ›ввести комментарий -› Создать запрос на перенос. В конечном итоге на 1 коммит впереди оригинала. - person cartland; 09.04.2015
comment
@cartland (или другие) - да, там написано, что эта ветка на 1 коммит впереди ... Об этом стоит беспокоиться? Можно ли избавиться от этого сообщения? - person RenniePet; 16.05.2015
comment
Само слияние кажется 1 коммитом впереди, как только вы завершите запрос на перенос, и это нормально. Заметил, что переключение веток у меня больше не работает. - person Matt Sanders; 18.06.2015
comment
@RenniePet В ветке This находится x коммитов перед (исходным) сообщением, x коммиты ссылаются на те / те, которые вы сделали, а ветвь восходящего потока (еще) не слилась. X в сообщении будет увеличиваться с каждой фиксацией, которую вы делаете в этой вилке. - person Scruffy; 21.07.2015
comment
@RenniePet Если вы выполните эти шаги (в основном шаг 3), вы можете получить Эта ветка даже с ‹parent›: master. - person Sahar Rabinoviz; 05.08.2015
comment
Эта работа, но она не принесла новые ветки в ваше репо - person dirceusemighini; 17.09.2015
comment
Это работает, но пользовательский интерфейс очень неуклюжий. Иногда по умолчанию предлагается обратная операция, то есть отправка запроса на вытягивание исходному источнику. - person runDOSrun; 30.05.2016
comment
Это работает, но они должны были использовать вилку перестановки и кнопку. Мне это кажется таким странным. Не очень интуитивно понятно .. - person Tarabass; 28.07.2016
comment
Каждый раз, когда вы это делаете, он добавляет к вилке коммит перед исходным. - person neilgee; 15.08.2016
comment
Шаги нуждаются в обновлении; по сути, вам нужно сравнить вилку в качестве основы с оригиналом в качестве вилки головки. Однако история коммитов не будет чистой. Вы можете выполнить слияние или сквош + слияние, что оставит вас с фиксацией слияния, или Rebase и слияние, что даст Эта ветвь - X совершает впереди, Y - позади ‹original›, и каждая фиксация будет с вами. - person Dan Dascalescu; 28.10.2016
comment
Скажем, изменения в моей вилке в основном состояли из правок в документации, которые могут быть выполнены через Интернет без клонирования. Вместо этого не стал бы выполнять Stick в командной строке - это просто. требовать клонирования репозитория через мое (возможно, ограниченное) подключение к Интернету? - person Damian Yerrick; 12.01.2017
comment
не было бы лучше, с простой кнопкой обновления или синхронизации! - person Transformer; 24.01.2017
comment
Какой недостаток уродливой фиксации слияния ?? Я не понимаю. Просто слейте, и все готово. Что-то мне не хватает? - person SwimBikeRun; 27.05.2018
comment
Лучший ответ на данный момент. Интересно, что для этого я интуитивно перешел на вкладку PR, не особо задумываясь. Однако я думаю, что было бы лучше иметь кнопку REBASE FORK рядом (или вместо нее) с кнопкой FORK. Это было первое, что я искал - кнопка Rebase Fork. - person Vladimir Djuricic; 09.04.2020
comment
Почему Github так долго не улучшил этот дурацкий интерфейс? Для сравнения требуется как минимум 3 клика и перезагрузить страницу на несколько секунд! тратить время! - person Time Killer; 12.02.2021
comment
@Transformer, ваше желание было предоставлено, правда, с опозданием на 4 года;) - person Madhu Bhat; 09.05.2021

Вот официальный документ 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, следуйте инструкциям здесь

person jumpnett    schedule 21.10.2013
comment
Это обновляет мою локальную вилку, но моя вилка на Github.com по-прежнему говорит о 43 фиксации. Мне пришлось использовать технику лобзика, чтобы создать для себя пулреквест, чтобы объединить основные изменения в мою вилку Github.com. - person Michael McGinnis; 23.01.2015
comment
@MichaelMcGinnis После локального слияния вам нужно будет отправить свои изменения в github. git push origin master - person jumpnett; 12.02.2015
comment
Было бы разумно нажать --follow-tags: stackoverflow.com/a/26438076/667847 - person kenny; 06.11.2015
comment
Я должен сделать это для всех веток отдельно git merge upstream/master, затем проверить, чтобы разработать ветку и сделать git merge upstream/develop - person Shobi; 28.05.2017
comment
stackoverflow.com/a/14074925/470749 был мне полезен, потому что я получал Permission denied (publickey). fatal: Could not read from remote repository. при попытке получить из учетной записи Github Facebook вверх по течению. - person Ryan; 26.01.2018
comment
Те из вас, кто следуют инструкциям, могут затем запустить git commit, затем git push, чтобы увидеть изменения вилки в вашем разветвленном репозитории GitHub. - person MilesMorales; 05.03.2020
comment
Это помогло. Для меня важна глава слияния. - person rundekugel; 29.09.2020
comment
я нашел этот способ более полезным, чем документация git! - person push33n; 16.06.2021

Многие ответы приводят к тому, что вилка перемещается на одну фиксацию вперед по сравнению с родительским репозиторием. В этом ответе резюмируются шаги, найденные здесь, которые будут переместите вилку в тот же коммит, что и родительский.

  1. Перейдите в каталог в свой локальный репозиторий.

    • Switch to master branch if you are not git checkout master
  2. Добавить родительский объект в качестве удаленного репозитория, git remote add upstream <repo-location>

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

    • At this stage you check that commits what will be merged by typing git status
  5. Проблема git push origin master

Для получения дополнительной информации об этих командах см. шаг 3 .

person Sahar Rabinoviz    schedule 05.08.2015
comment
@MT: Но где вы вводите эти команды? Суть вопроса, насколько я понимаю, заключается в том, как повторно синхронизировать ваш личный форк GitHub с основным проектом и делать все это с GitHub. Другими словами, как вы можете обновить удаленную вилку без локального репозитория? - person John Y; 16.05.2016
comment
@JohnY Использование GitHub всегда создает дополнительную фиксацию. Вам нужно сделать все это в оболочке в локальном репо, чтобы избежать этой дополнительной фиксации. - person Jonathan Cross; 15.10.2016

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

Из локального клона вашей вилки создайте свой вышестоящий пульт. Вам нужно сделать это только один раз:

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

Затем всякий раз, когда вы хотите догнать главную ветку вышестоящего репозитория, вам необходимо:

git checkout master
git pull upstream master

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

После первоначальной настройки восходящего потока и проверки главного сервера все, что вам нужно сделать, это выполнить следующую команду, чтобы синхронизировать ваш главный сервер с восходящим потоком: git pull upstream master.

person Slion    schedule 03.01.2017
comment
Вы также можете переустановить свою ветку разработки на свой теперь обновленный локальный мастер. Как я могу это сделать? - person Niels; 15.10.2020
comment
Сначала запустите git checkout my-dev-branch, чтобы переключиться на ветку разработчика, затем git rebase master. Вы также можете просто запустить git rebase master my-dev-branch, который в основном объединяет эти две команды. См. документацию по git rebase. - person Slion; 16.10.2020

Предисловие: ваш форк является «источником», а репозиторий, из которого вы разветвлялись, - «восходящим потоком».

Предположим, вы уже клонировали вилку на свой компьютер с помощью такой команды:

git clone [email protected]:your_name/project_name.git
cd project_name

Если это указано, вам нужно продолжить в следующем порядке:

  1. Добавьте «апстрим» в свой клонированный репозиторий («origin»):

    git remote add upstream [email protected]:original_author/project_name.git
    
  2. Получите коммиты (и ветки) из "восходящего потока":

    git fetch upstream
    
  3. Переключитесь на "master" ветку вашей вилки ("origin"):

    git checkout master
    
  4. Сохраните изменения в вашей "основной" ветке:

    git stash
    
  5. Слейте изменения из «master» ветки «upstream» в «master» ветку вашего «origin»:

    git merge upstream/master
    
  6. Разрешить конфликты слияния, если они есть, и зафиксировать слияние

    git commit -am "Merged from upstream"
    
  7. Вставьте изменения в свою вилку

    git push
    
  8. Верните свои спрятанные изменения (если есть)

    git stash pop
    
  9. Готово! Поздравляю!

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

person Benny Neugebauer    schedule 16.03.2016
comment
Отчасти помогло: git remote add upstream [email protected]:original_author/project_name.git просто псевдоним для git remote add upstream https://github.com/original_author/project_name.git? - person Wolf; 26.06.2017
comment
Wolf, полагаю, вы уже это знаете, но для потомков ... Это формат для ssh. help.github.com/articles/configuring-a-remote -for-a-fork - person Brad Ellis; 27.01.2018
comment
Большое тебе спасибо. git stash и git stash pop часть очень полезна - person Bal Krishna Jha; 04.03.2019
comment
Это сработало. После git merge upstream / master автоматическое слияние не удалось из-за несвязанных путей, которые мне пришлось запустить git add -A, затем git commit -m message, тогда оно было актуальным. - person highcenbug; 31.12.2019

С ноября 2013 года в GitHub был открыт неофициальный запрос функции, в котором предлагалось добавить очень простой и интуитивно понятный метод для синхронизации локальной вилки с восходящим потоком:

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

Примечание. Поскольку запрос функции является неофициальным, также рекомендуется связаться с [email protected], чтобы добавить вашу поддержку для реализации такой функции. Вышеупомянутый неофициальный запрос функции может быть использован как доказательство заинтересованности в этой реализации.

person isedwards    schedule 21.02.2016

На дату этого ответа у GitHub нет (или я должен сказать больше?) эта функция в веб-интерфейсе. Однако вы можете попросить [email protected] проголосовать за это.

Тем временем пользователь GitHub bardiharborow создал инструмент для этого: https://upriver.github.io/

Источник находится здесь: https://github.com/upriver/upriver.github.io

person Lucero    schedule 14.09.2016
comment
Хотя я считаю этот инструмент хорошей идеей, на самом деле он СЛОМАН. Он загрузил только 20 репозиториев из моей учетной записи, и даже нижний колонтитул перенаправлял на несуществующий веб-сайт. Если это будет исправлено, я буду большим защитником. - person sorin; 28.10.2016
comment
На сегодняшний день я успешно использовал восходящий поток для синхронизации форка с вышестоящим репо, поэтому он работает для моих целей, и я буду продолжать его использовать. - person NauticalMile; 17.07.2017
comment
@sorin Эти 20 ограничений репо / веток (точнее, сейчас 30) исходят из настроек разбиения по страницам GitHub по умолчанию. Чтобы справиться с этим, необходимо внести некоторые изменения в код. - person Andreas; 18.01.2018

Если вы используете GitHub для Windows или Mac, то теперь у них есть возможность обновлять вилки одним щелчком мыши:

  1. Выберите репозиторий в пользовательском интерфейсе.
  2. Нажмите кнопку «Обновить от пользователя / ветви» вверху.
person Shital Shah    schedule 31.03.2016
comment
Пошагово: github.com/desktop/desktop/issues/1785#issuecomment- 483011281 - person Alamakanambra; 25.03.2020

Есть способ сделать это из веб-приложения GitHub.

Давайте рассмотрим следующий пример.

Для начала откройте репо, которое вы хотите обновить.

введите описание изображения здесь

Видно предупреждение

Эта ветка на 157 коммитов стоит за GoogleCloudPlatform: master.

Справа есть две кнопки Pull request и Compare. Нажмите Compare.

Так как сравнивать наверное не с чем, нажмите switching the base

введите описание изображения здесь

Появится список всех изменений, и можно будет создать запрос на перенос, нажав кнопку Create pull request.

введите описание изображения здесь

Дайте ему название, скажем, Обновить репо

введите описание изображения здесь

И создайте запрос на перенос.

После создания запроса прокрутите вниз и нажмите Merge pull request.

введите описание изображения здесь

Подтвердите слияние и все!

person Gonçalo Peres 龚燿禄    schedule 22.12.2020
comment
Большое спасибо ! Это так просто! - person Haijerome; 24.02.2021
comment
Помните об этом и взгляните здесь: github.community/t/ - person Jens; 27.04.2021

Фактически, можно создать ветку в своей вилке из любого коммита апстрима в браузере:

Введите здесь описание изображения

Затем вы можете загрузить эту ветку в свой локальный клон, и вам не придется отправлять все эти данные обратно в GitHub, когда вы отправляете изменения поверх этой фиксации. Или используйте веб-интерфейс, чтобы что-то изменить в этой ветке.

Как это работает (это предположение, я не знаю, как именно это делает GitHub): вилки разделяют хранилище объектов и используют пространства имен для разделения пользовательских ссылок. Таким образом, вы можете получить доступ ко всем коммитам через ваш форк, даже если они не существовали на момент форкования.

person max630    schedule 18.01.2017
comment
Отлично! Это позволяет избежать бессмысленной загрузки этих коммитов на github. - person Rotsor; 13.03.2017

Я обновляю свои разветвленные репозитории одной строкой:

git pull https://github.com/forkuser/forkedrepo.git branch

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

person Rafael Z. B. Bravo    schedule 08.09.2017
comment
Есть ли на это ограничения? т.е. применяется ли это только к случаям, когда вы не добавляли коммиты, слияния, запросы на вытягивание или если запросы на вытягивание были объединены в восходящий поток с момента последнего обновления? - person LightCC; 11.09.2017
comment
он работает как обычное извлечение из удаленной ветки. Если вы выполнили X коммитов в своем локальном репо, а теперь у вас Y коммитов за исходным репо, это принесет Y коммитов в вашу локальную ветвь и, возможно, поможет вам разрешить некоторые конфликты. - person Rafael Z. B. Bravo; 11.09.2017
comment
@LightCC Это не отличается от извлечения с ранее добавленного пульта ДУ, за исключением того факта, что вы не добавили remote. Таким образом, недостатком является то, что вам придется вводить полный URL-адрес репозитория каждый раз, когда вы захотите pull. - person Marc.2377; 17.04.2019
comment
Это идеальное решение, если вам не нужно много раз извлекать из исходного репо, или если проект разветвляется относительно просто. - person AxeEffect; 29.04.2020

Следуйте приведенным ниже инструкциям. Я попробовал их, и это мне помогло.

Касса в вашем отделении

Синтаксис: git branch yourDevelopmentBranch
Пример: git checkout master

Получите ветку исходного репозитория, чтобы получить последний код

Синтаксис: git pull https://github.com/tastejs/awesome-app-ideas master
Пример: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME

person Venkat.R    schedule 15.01.2016
comment
Если вы используете GitHub, вы также можете отправить свои изменения в ветку GitHub. git push HttpsForYourForkOfTheRepo BRANCH_NAME - person user3731622; 22.01.2016

В дополнение к этому ответу я искал способ обновить все удаленные ветки моего клонированного репо (origin) из ветвей восходящего потока за один раз. Вот как я это сделал.

Предполагается, что вы уже настроили восходящий удаленный доступ к исходному репозиторию (откуда был разветвлен origin) и синхронизировали его с git fetch upstream.

Затем запустите:

for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done

Первая часть этой команды перечисляет все заголовки в удаленном репо восходящего потока и удаляет SHA-1, за которым следует префикс имени ветки refs/heads/.

Затем для каждой из этих ветвей он подталкивает локальную копию ветки удаленного отслеживания восходящего потока (refs/remotes/upstream/<branch> на локальной стороне) непосредственно в удаленную ветвь в origin (refs/heads/<branch> на удаленной стороне ).

Любая из этих команд синхронизации веток может завершиться ошибкой по одной из двух причин: либо ветвь восходящего потока была переписана, либо вы отправили коммиты этой ветки в свою вилку. В первом случае, когда вы ничего не передали в ветку вилки, можно безопасно нажать принудительно (добавьте переключатель -f, т.е. git push -f в приведенную выше команду). В другом случае это нормально, поскольку ваша ветвь fork разошлась, и вы не можете ожидать, что команда sync будет работать, пока ваши коммиты не будут объединены обратно в upstream.

person Thomas Guyot-Sionnest    schedule 12.06.2017

Приложение "Pull" - это автоматическое решение, которое можно настроить и забыть. Он синхронизирует ветвь по умолчанию вашей вилки с вышестоящим репозиторием.

Посетите URL-адрес, нажмите зеленую кнопку «Установить» и выберите репозитории, в которых вы хотите включить автоматическую синхронизацию.

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

person krlmlr    schedule 20.11.2019
comment
Обратите внимание, что при базовой настройке вы можете потерять изменения, сделанные в вашем разветвленном репозитории. Чтобы сохранить изменения, настройте файл конфигурации и укажите mergemethod. Подробнее об этом здесь - person Saurabh P Bhandari; 21.11.2019
comment
Я заметил, что базовая установка отправляет запросы на вытягивание и объединяет их (в отличие от того, что указано в документации). Это немного раздражает, но решает проблему потери данных? - person krlmlr; 21.11.2019

GitHub теперь представил функцию для синхронизации вилки одним нажатием кнопки.

Перейдите к своей вилке, нажмите Fetch upstream, а затем нажмите Fetch and merge, чтобы напрямую синхронизировать вилку с родительским репозиторием.

введите описание изображения здесь

Вы также можете нажать кнопку Compare, чтобы сравнить изменения перед объединением.

Ссылка: твит на GitHub

person Madhu Bhat    schedule 06.05.2021
comment
Я попробовал это и никакого пиара не получилось, круто! И если ваша ветка может быть синхронизирована с помощью быстрого слияния, расхождения не произойдет. - person li ki; 08.05.2021
comment
На данный момент эта функция сначала сравнит имя ветки между исходным и разветвленным репозиториями. Если такое же имя найдено, восходящей ветвью в вилке является ветка с тем же именем в оригинале; если он не найден, восходящий поток будет ветвью по умолчанию (HEAD) оригинала. В большинстве случаев это работает нормально, но если в исходном репо произошла некоторая модификация ветки (например, добавление или удаление ветки с тем же именем, которое уже существует в разветвленном репо, или изменение ветки по умолчанию), результат синхронизации может не соответствовать вашим ожиданиям. - person li ki; 08.05.2021

Если вы настроите свой upstream. Проконсультируйтесь с git remote -v, тогда этого будет достаточно.

git fetch upstream
git checkout master
git merge --no-edit upstream/master
git push
person prosti    schedule 11.06.2019

Когда вы клонировали свой разветвленный репозиторий, перейдите по пути к каталогу, в котором находится ваш клон, и к нескольким строкам в вашем терминале Git Bash.

$ cd project-name

$ git remote add upstream https://github.com/user-name/project-name.git
 # Adding the upstream -> the main repo with which you wanna sync

$ git remote -v # you will see the upstream here 

$ git checkout master # see if you are already on master branch

$ git fetch upstream

И вот вам хорошо идти. Все обновленные изменения в основном репозитории будут помещены в репозиторий вашей вилки.

Команда «fetch» ​​незаменима для поддержания актуальности проекта: только при выполнении «git fetch» ​​вы будете проинформированы об изменениях, которые ваши коллеги отправили на удаленный сервер.

Вы по-прежнему можете посетить здесь для получения дополнительных запросов.

person Prateek Chanda    schedule 10.03.2018

Android Studio теперь научилась работать с репозиториями вилок GitHub (вам даже не нужно добавлять удаленный репозиторий «вверх по течению» с помощью консольной команды).

Откройте меню VCSGit

И обратите внимание на два последних пункта всплывающего меню:

  • Перебазируйте вилку GitHub

  • Создать запрос на включение

Попробуйте их. Я использую первый для синхронизации моего локального репозитория. В любом случае ветки из родительского удаленного репозитория («апстрим») будут доступны в Android Studio после того, как вы нажмете «Rebase my GitHub fork», и вы сможете легко с ними работать.

(Я использую Android Studio 3.0 с плагинами «Git integration» и «GitHub».)

Введите здесь описание изображения

person alexshr    schedule 13.11.2017

Это зависит от размера вашего репозитория и от того, как вы его разветвляли.

Если это довольно большой репозиторий, возможно, вы захотели управлять им особым образом (например, историей сброса). По сути, вы можете получить различия между текущей и исходной версиями, зафиксировать их, а затем вернуть вишню в мастер.

Попробуйте прочитать этот. В нем описывается, как работать с большими репозиториями Git и как размещать их с последними изменениями.

person s0nicYouth    schedule 23.04.2017

Я хотел бы добавить к @ krlmlr ответ.

Изначально у разветвленного репозитория есть одна ветка с именем: master. Если вы работаете над новой функцией или исправлением, вы обычно создаете новую ветку feature и вносите изменения.

Если вы хотите, чтобы разветвленный репозиторий синхронизировался с родительским репозиторием, вы можете настроить файл конфигурации (pull.yml) для Вытяните приложение (в ветке функций), например:

version: "1"
rules:
  - base: feature
    upstream: master
    mergeMethod: merge
  - base: master
    upstream: parent_repo:master
    mergeMethod: hardreset

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

Здесь задействованы два mergemethods, один - hardreset, который помогает принудительно синхронизировать изменения в master ветви разветвленного репо с родительским репо, а другой метод - merge. Этот метод используется для объединения изменений, сделанных вами в ветке feature, и изменений, сделанных из-за принудительной синхронизации в ветке master. В случае конфликта слияния приложение для извлечения позволит вам выбрать следующий курс действий во время запроса на извлечение.

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

В настоящее время я использую эту конфигурацию в своем разветвленном репозитории здесь, чтобы убедиться, что запрашиваются улучшения здесь остается обновленным.

person Saurabh P Bhandari    schedule 21.11.2019

Предполагая, что ваша вилка https://github.com/me/foobar, а исходный репозиторий - https://github.com/someone/foobar

  1. Посетите https://github.com/me/foobar/compare/master...someone:master

  2. Если вы видите зеленый текст Able to merge, нажмите Создать запрос на перенос.

  3. На следующей странице прокрутите страницу вниз и нажмите Запрос на включение слияния и Подтвердить слияние.

person Ilyich    schedule 18.02.2021
comment
Вы заслуживаете награды. Хороший ответ. У меня это сработало, и я думаю, что это нормально. Я пошел и сделал git pull после моего локального репо и обновился. Ваши инструкции хороши. Для кого-то новенького вам придется сначала поиграть с раскрывающимися списками на экране сравнения, чтобы стрелка двигалась в правильном направлении. Это дает вам github.com/myside...theirside правильную ссылку в адресной строке. - person Celess; 15.03.2021
comment
Нобелевская премия за этого человека и решение! - person Stack The User; 23.03.2021

Есть две основные вещи, чтобы постоянно обновлять разветвленный репозиторий.

1. Создайте ветви из мастера вилки и внесите в них изменения.

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

2. Создайте запланированное задание для мастера вилки, чтобы выполнять обновление автоматически.

Это можно сделать с помощью cron. Вот пример кода, если вы делаете это в Linux.

$ crontab -e

поместите этот код в crontab file для ежечасного выполнения задания.

0 * * * * sh ~/cron.sh

затем создайте файл сценария cron.sh и взаимодействие с git с помощью ssh-agent и / или ожидайте, как показано ниже

#!/bin/sh
WORKDIR=/path/to/your/dir   
REPOSITORY=<name of your repo>
MASTER="[email protected]:<username>/$REPOSITORY.git"   
[email protected]:<upstream>/<name of the repo>.git  

cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
    echo "all the same, do nothing"
else
    echo "update exist, do rebase!"
    git reset --hard upstream/master
    git push origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`

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

Эта ветка есть даже с <upstream>: master.

 введите описание изображения здесь

person Chetabahana    schedule 08.06.2019

Используйте эти команды (в удачном случае)

git remote -v
git pull
git fetch upstream
git checkout master
git merge upstream/master --no-ff
git add .
git commit -m"Sync with upstream repository."
git push -v
person Do Nhu Vy    schedule 09.02.2020
comment
Если есть конфликт, нужно только разрешить его после команды слияния и пометить разрешенные с помощью команды git add для конфликтующих файлов. Кроме того, если рассматриваемое репо является разветвленным, кто-то должен сначала определить upstream: git remote add upstream https://...git, где git предназначен для репо, которое было разветвлено. - person Csaba Toth; 30.06.2021
comment
Кроме того, PR GitHub (кнопка UI Fetch создает PR против репозитория вилки) - это дерьмо, если есть конфликт. Я бы предпочел просто выполнить эти ручные шаги. - person Csaba Toth; 30.06.2021

rm -rf oldrepository
git clone ...

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

person Tuntable    schedule 29.09.2020

Попробуйте это, нажмите Fetch upstream, чтобы синхронизировать ваше разветвленное репо с восходящим мастером. введите описание изображения здесь

person Kumar Gaurav    schedule 25.05.2021

Если вы используете GitHub Desktop, вы можете легко сделать это всего за 6 шагов (на самом деле всего 5).

Как только вы откроете Github Desktop и выберете свой репозиторий,

  1. Перейти на вкладку История
  2. Щелкните по строке поиска. Он покажет вам все доступные ветки (включая восходящие ветки из родительского репозитория).
  3. Выберите соответствующую восходящую ветвь (это будет восходящая / основная ветвь для синхронизации главной ветки)
  4. (НЕОБЯЗАТЕЛЬНО) Он покажет вам все коммиты в восходящей ветке. Вы можете щелкнуть любую фиксацию, чтобы увидеть изменения.
  5. Щелкните Объединить в master / branch-name в зависимости от вашей активной ветви.
  6. Подождите, пока GitHub Desktop сотворит чудеса.

В качестве примера ознакомьтесь с приведенным ниже GIF-файлом:

Синхронизировать восходящие ветки в разветвленном репозитории из родительского репозитория

person Gangula    schedule 17.11.2020

Удалите удаленного разработчика со страницы github

затем примените эти команды:

1) git branch -D dev
2) git fetch upstream
3) git checkout master
4) git fetch upstream && git fetch upstream --prune && git rebase upstream/master && git push -f origin master
5) git checkout -b dev
6) git push origin dev
7) git fetch upstream && git fetch upstream --prune && git rebase upstream/dev && 8) git push -f origin dev
person x-rw    schedule 17.12.2020

Если вы хотите, чтобы ваши форки GitHub были в актуальном состоянии с соответствующими восходящими потоками, также существует эта пробная программа специально для GitHub: https://probot.github.io/apps/pull/, который выполняет свою работу. Вам нужно будет разрешить установку в своей учетной записи, и это будет поддерживать ваши вилки в актуальном состоянии.

person metanerd    schedule 18.01.2021

Как обновить разветвленное репо на локальном компьютере?

Сначала проверьте свой пульт / мастер

git remote -v

У вас должен быть origin и upstream. Например:

origin  https://github.com/your___name/kredis.git (fetch)
origin  https://github.com/your___name/kredis.git (push)
upstream    https://github.com/rails/kredis.git (fetch)
upstream    https://github.com/rails/kredis.git (push)

После этого перейдите на главную:

git checkout main

и слить из апстрима в основной:

git merge upstream/main
person AlexSh    schedule 04.02.2021