Подтвердить что ты не робот

Как объединить изменения в не-основных ветвях из разветвленного репозитория github?

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

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

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

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

4b9b3361

Ответ 1

Сценарий 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, поэтому, если вы хотите отслеживать изменения мастера, вы можете создать ветвь отслеживания в своем разветвленном репо и объединить эти изменения в свою ветку master forks, когда хотите что-то совершить. Я настоятельно рекомендую "GitHub gem", который является инструментом, который вы можете установить, чтобы помочь вам легко отслеживать изменения в любом другом репозитории, связанном с вашим. См. Текст README внизу этой страницы для установки и использования: http://github.com/defunkt/github-gem/tree/master

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

Рабочий процесс Django Github

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

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

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

  • Храните репозитории в синхронизации так, чтобы каждый из них содержал полный "официальный" репозиторий
  • Разрешить разработчикам публиковать официальные обновления.
  • Поощрять работу над ветвями, отличными от master

Ответ 2

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

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

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

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

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

 git branch -r 

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

 git push origin :anOldBranch

Тогда

 git remote prune origin

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

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

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

Ответ 3

Я наткнулся на этот ответ, глядя на то, как сделать Сценарий 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