Github rebase upstream/master с оригиналом/мастером

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

Что произошло

  • Я разворачивал MassTransit в Июль 2012. Тогда его главная ветвь была в версии v2.1.1, с последней фиксацией на 29 марта 2012.
  • Следуя рекомендациям github, я начал кодировать некоторые изменения в ветке темы.
  • Несколько коммитов позже, когда функция была закончена, я объединил свою ветку темы в свой локальный мастер клонирования, а затем перетащил ее в github.
  • С тех пор, как 29 марта 2012 года, MassTransit разрабатывался в своей ветке разработки. Все эти изменения, составляющие v2.6.0, были недавно объединены с его мастером.

Что я хотел бы сделать

Я хотел бы получить все изменения, которые были объединены в upstream/master. Предпочтительно, как их соответствующие коммиты, а не одно массовое совершение сотен файлов. Поскольку я занимался разработкой прежнего upstream/master (датированный 29 марта 2012 г.), мне было бы действительно нужно "вставить" некоторые коммиты между последней версией восходящего/основного изменения 29 марта и моей первой фиксацией 8 августа и то поверх этого добавьте те, которые произошли позже. Как это сделать?

(Я также хотел бы не уничтожать мои коммиты/вилку в этом процессе;)

Что я пробовал

git checkout master
git remote add upstream git://github.com/phatboyg/MassTransit.git
git rebase upstream/master
git push

Однако это не позволило мне сделать git push, жалуясь, что мой локальный совет был 10 коммитов за исходным кодом (возможно, коммиты, которые я сделал на моей ветки темы, а затем объединены в начало/мастер?).

Рекомендации

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

Как вы, ребята, управляете своими вилами?

Другие вопросы

Мне не удалось найти способ визуализации истории ветвей, какая ветка была объединена с другой, а когда и т.д. Github для Windows показывает только плоскую историю для выбранной в данный момент ветки (грустное лицо здесь). На веб-сайте есть некоторые визуализации для сети (вот для MassTransit), но это кажется намного менее информативным, чем сказать в TortoiseHg. Мне что-то не хватает? Все ли еще помнят, что было объединено с тем, что и когда?

Изменить (31 августа)

Я рассказываю о плохой визуализации, чтобы помочь объяснить, что произошло.

  • Я разветвлялся, когда C1 был последним в upstream/master.
  • Затем я развил свое происхождение/особенность-1.
  • Одна из функций была завершена, я объединил ее с моим источником/мастером.
  • Когда функция upstream/mega-feature была завершена, она была объединена с upstream/master, эффективно исторически копируя C2 и C3 для восходящего/ведущего. (Или, возможно, восходящий/мастер был переустановлен с восходящей/мегафункцией?)
  • Теперь я хотел бы скопировать C2, C3 и C4 в исходное состояние/мастер.

Ответ 1

Я предполагаю, что вы будете или настроили пульт origin на свою вилку, а также снова на upstream (как описано).

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

Визуализация gitk --all полезна здесь. Не забывайте, что даже если вы делаете rebase, старая серия фиксации все еще существует, поэтому вы можете дать ей имя


[EDIT] Многословное описание.

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

  • создайте ветвь temp в текущей голове, чтобы ничего не потерялось.
  • reset ваша главная ветка возвращается к последнему общему фиксации между вами и восходящим потоком.
  • reset ветвь вашей функции перед слиянием.
  • checkout, которые объединяют фиксацию, чтобы получить рабочее дерево, как вы ожидаете, затем
  • переключитесь на свою ветку функций (не проверяя ничего!)
  • commit, что фиксированное дерево работы на ветке feature (т.е. без слияния).

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

  • pull из восходящего потока - он (т.е. master и т.д.) должен все ускорить.
  • rebase те события после объединения с temp на feature (если требуется).
  • rebase feature до последней фиксации, которую вы хорошо знаете на сервере (должно быть относительно легко).
  • rebase feature (снова) до последней фиксации на главном устройстве, исправление по ходу (в сочетании с последним шагом, если это легко; -).

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

Ответ 2

Вот некоторые идеи.

Метод выбора черри:

git checkout master
git cherry-pick C2..C4

Новый метод переадресации:

git checkout upstream/master
git branch new-master
git rebase master
# new-master should now look like what you want, once you confirm this
git branch -m master old-master
git branch -m new-master master

Rebase --onto метод (позволяет выбрать, какой диапазон коммандов вы хотите):

git checkout master
git rebase --onto master C2 C4 # puts you into a detached HEAD
git branch new-master
# rename branch as above if it is correct