2016-06-27 3 views
1

ситуации Я думаю, что картина является лучшим объяснением:Git: Обновление ветви, которые зависят друг от друга

enter image description here

Как вы можете видеть, у нас есть несколько филиалов, большинство из них solution-xyz-foo для изменения номера xyz. solution-12 строит на solution-11 и так далее. Также имеются некоторые отклонения от этого правила, например. филиал hystrix-dashboard-demo.

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

Кроме того, можно рассмотреть решения каждого упражнения, которые предоставляются как единое целое.

Другими словами, для участников курса ветви/решения, построенные друг над другом, служат большим преимуществом, которое мы хотели бы сохранить (это основано на отзывах нескольких курсов, проведенных до сих пор).

Как разработчик курса (подготовка упражнений и решений, представление контента участникам и т. Д.), Мы должны время от времени обновлять части кода. Например, это может быть случай, когда мы хотим исправить проблему в solution-3. Чтобы сделать это исправление видимым в solution-4 и т. Д., Нам нужно либо слить/переустановить/вишнево выбрать фиксацию, содержащую исправление. Чтобы избежать огромного беспорядка, мы решили раздавить все обновления каждого решения в одном коммите, а затем перестроить несколько линейную структуру, показанную на картинке, используя несколько переустановок.

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

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

В качестве побочного примечания мы теряем очевидное преимущество git: нет истории изменений (и старые версии теряются). Кроме того, разработчикам необходимо сотрудничать и сообщать об изменениях в коде.

Вопрос Вы можете рекомендовать ЛЮБОЙ тег/ветвь/rebase/... рабочий процесс, который решает следующие проблемы?

  • участники курса могут легко оформить в последнюю дату решения для осуществления в настоящее время они работают над (EDIT: В настоящее время, делая это с помощью мыши в Eclipse, является предпочтительным способом)
  • решения для каждого упражнения предоставляются удобным образом (т. е.единственная фиксация)
  • разработчики могут легко интегрировать исправления и обновления для отдельных решений, так что и позже решения здания на нем обновляются соответственно
  • [опционально] история изменений сохраняется

Как примечание, вы можете предположить, что код не изменяется во время прохождения курса (поэтому на компьютерах участников не требуется git remote update).

ответ

1

Вместо того, чтобы получать доступ к каждому «решению-xyz-foo» в качестве отдельных ветвей, попробуйте обратиться к нему как к поисковому фиксатору предка в цепочке.

git checkout -b MyWorkingBranch remotes/origin/LAST_COMMIT_IN_COURSE^\{/solution-xyz\} 

затем извлечения после 'перебазироваться --onto IMPROVED_COMMIT' будет производить ветви на основе IMPROVED_COMMIT

см

git help revisions 

, если вы используете тег вместо ветвей, вы можете использовать

git filter-branch --tag-name-filter <rename command> 

обновить все теги, которые ссылаются на все измененные комм. его. См. «Git help filter-branch». Снова ученики могли получать ветки непосредственно из имен тегов с помощью «git checkout -b TAGNAME», и история была бы доступна.

+0

Это многообещающе.Я боюсь, что проблема заключается в удобстве использования на стороне участника (git in Eclipse). Я дам ему попробовать завтра, спасибо! –

+0

Используя 'tag-name-filter', я могу обновлять имена уже существующих тегов, поэтому мне пришлось бы добавить магию« фильтр-ветвь », чтобы выполнить фактическую перезагрузку. Вместо этого, я думаю, что я очень доволен тем, что сначала сделал rebase (из последней фиксации поверх изменения), а затем запустил крошечный скрипт, используя трюк ревизии, который вы упомянули в своем ответе на прикрепление тегов. –

0

Так что это звучит как хирургическая перестановка в середине цепи, чтобы исправить некоторую фиксацию, за которой следует другая перебаза (ранее) после коммитов - вновь зафиксированная фиксация. Поэтому я смущен комментарием «... даже со вспомогательным скриптом (который снова привязывает ветви к коммитам после переустановки, но их нужно поддерживать в случае новых/измененных имен ветвей) ...». Казалось бы, это возможно (возможно) так же просто, как rebase -onto вашего обновленного коммита, поэтому нет необходимости поддерживать его для новых/измененных имен ветвей - все это происходит с помощью rebase, нет?

+0

То, что вы описываете, это то, что мы сделали в первую очередь. Текущий подход состоит в том, чтобы просто выполнить одну перестановку ('solution-24' поверх фиксированной фиксации), а затем присоединить' solution-23' к 'solution-24 ^', 'solution-22' to' solution-23^'и т. д. Это то, что делает вспомогательный скрипт. Проблема заключается в обновлении нижних ветвей после перезагрузки. –

+0

Итак, если у вас есть исправление ошибки для решения-X, вы делаете свое изменение на эту фиксацию и, возможно, переформатируете squash, которые меняются с помощью исходного решения-X, чтобы получить решение-X 'commit. Теперь, после того, как вы переустановите решение (X + 1) на Solution-X, все Solution- (X + N) сменит ваше добавление на первом шаге. Все Solution- (X-N) (из-за решения-X), по-видимому, не нуждаются в исправлении, чтобы они оставались как есть. Если нет, то я явно не понимаю, что вы пытаетесь сделать, и давайте просто оставим это на этом. – DavidN

+0

Я ценю ваш интерес! Если я переупакую решение-9 поверх обновленной ветки-8 решения, ТОЛЬКО решение-9 (и, конечно же, решение-8) верны. Решение-10 по-прежнему указывает на старые фиксации, соответствующие решениям 9 и 8 без исправления. Таким образом, мне также нужно переустановить ВСЕ ветки после решения-8 (9, 10, ..., 24). EDIT: если вы повторяете rebase для увеличения значений N, вы получаете несколько копий нижнего решения (один появляется для каждой rebase). Это можно обойти, переустанавливая шаг за шагом, всегда только на предыдущей ветке, начинающейся внизу. –

Смежные вопросы