Как объединить изменения в ветвях, не являющихся основными, из разветвленного репозитория github? - PullRequest
15 голосов
/ 06 января 2010

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

Однако мне неясно, как вы будете в курсе неосновных веток в исходном репо, которые вы разветвили. Например, когда я изначально разветвлял хранилище фабрики bitprophet , оно содержало следующие ветви:

  • мастер
  • 0,9
  • 0,9-doc-rewrite (больше не существует)
  • path-and- # 24 (больше не существует)

Последние две ветви больше не существуют, и теперь есть новая ветка flexible-task-declarations. Я извлек, слил и передал свою ветку master, так что master, origin / master и upstream / master имеют одинаковый хэш SHA1 и указывают на один и тот же снимок git. Тем не менее, я не уверен, как удалить ветки, которые больше не существуют, и обновить новые ветви, чтобы мой ответвление обновлялось. Нужно ли отслеживать каждую вышестоящую ветвь, а затем извлекать, объединять и передавать каждую ветвь по отдельности, или есть лучший способ?

Ответы [ 3 ]

24 голосов
/ 06 января 2010

Сценарий 1: удаление ветвей, которые больше не существуют

Чтобы удалить ветви, которых больше не существует, я следовал инструкциям в ответе на вопрос StackOverflow Как удалить ветку Git как локально, так и в Github? , выполнив команду следующие команды:

$ git push origin :0.9-doc-rewrite
$ git push origin :path-and-#24

Сценарий 2. Объединение изменений в существующей ветке, не являющейся главной.

Чтобы обновить ветку upstream / 0.9, я сделал следующее:

$ git checkout --track origin/0.9
$ git fetch upstream
$ git merge upstream/0.9
$ git push

Сценарий 3: отслеживание новых неосновных веток

Не уверен, что это лучший способ справиться, но вот что я сделал:

$ git branch flexible-task-declarations upstream/flexible-task-declarations
Branch flexible-task-declarations set up to track remote branch flexible-task-declarations from upstream.
$ git checkout flexible-task-declarations
$ git push origin flexible-task-declarations

Чтобы подтвердить, что все ветви находятся на одном и том же коммите:

$ git branch -av

Это покажет все ветви - локальные и удаленные - и покажет самое последнее сообщение о коммите и хэш SHA1.

Веб-исследование, которое может пролить свет на лучший метод обработки сценария 3

Ключевое различие между форком Git по сравнению с простым клоном Git или проверкой SVN состоит в том, что ваш форк никогда не будет обновляться с главным репо, если вы не сделаете это. К счастью, есть простой инструмент, который поможет вам сделать это. Ваш форк отделен и равен мастеру в терминах Git, поэтому, если вы хотите отслеживать изменения в мастере, вы можете создать отслеживающую ветвь в своем разветвленном репо и объединить эти изменения с мастер-веткой вашего форка всякий раз, когда вы хотите что-то зафиксировать. Я настоятельно рекомендую гем GitHub, который вы можете установить, чтобы легко отслеживать изменения в любом другом репозитории, связанном с вашим. См. Текст README внизу этой страницы для установки и использования: http://github.com/defunkt/github-gem/tree/master

Игнорировать очередь Github Fork Это зло! Очередь ветвления - это инструмент для сопровождающих, которые любят выбирать отдельные коммиты от участников, но не желают объединяться во всей своей ветке. Если вы поэкспериментируете с очередью разветвлений, вы повредите разветвление (хотя это можно исправить, прочитайте что-то пошло не так). Многие новички на github чувствуют, что должны что-то делать с очередью ветвлений, потому что там есть много, возможно, противоречивых изменений, и они не знают, какой предполагаемый способ поддерживать свою ветвь в актуальном состоянии. Прочитайте Поддерживая свою вилку в актуальном состоянии и узнайте!

Рабочий процесс Джанго на Github

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

Различная начальная конфигурация вилки

Длинный гостевой пост Нгуена под названием Настройка репозиториев Git для проектов с открытым исходным кодом на GitHub в блоге Майкла Хартла описывает интересный способ настройки репозитория Github, который вы разветвили. Цели этого метода в соответствии со статьей:

  • Синхронизируйте репозитории, чтобы каждый из них содержал полный «официальный» репозиторий
  • Разрешить разработчикам получать официальные обновления
  • Поощряйте работу с ветками, отличными от master
3 голосов
/ 06 января 2010

В принципе, у вас есть 3 удаленных репозитория Git:

  • local: ваше текущее git-репо на вашей рабочей станции.
  • происхождение: какая у вас раздвоенная версия ткани: кучевая посуда
  • вверх по течению: bitprophet / fabric , один в начале всех других разветвленных репо

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

 git remote add upstream http://github.com/bitprophet/fabric.git

посмотрите на удаленные ветки

 git branch -r 

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

 git push origin :anOldBranch

Тогда

 git remote prune origin

очистить ветки в вашем локальном репо (которые больше не существуют на источнике, так как вы их просто удалили)

Ветви, которые существуют как в исходном, так и в восходящем направлении, также должны быть синхронизированы (перебазирование ваших локальных веток поверх тех, которые находятся в восходящем направлении перед отправкой вашей работы в исходное положение, может быть хорошим способом сделать очень простой запрос на отправку в восходящий поток: у bitprophet будет только быстрое слияние, чтобы включить вашу работу)

Я не знаю, можно ли использовать более простой процесс / команду / скрипт для синхронизации двух удаленных репозиториев.

2 голосов
/ 19 декабря 2013

Я наткнулся на этот ответ, когда искал, как правильно выполнить Сценарий 3 в принятом ответе. Немного покопавшись, с git 1.8 вы можете сделать следующее:

git fetch upstream                      ;make sure you have all the upstream changes
git checkout --no-track upstream/0.9    ;grab the new branch but don't track it
git branch --set-upstream-to=origin/0.9 ;set the upstream repository to your origin
git push                                ;push your new branch up to origin
...