2015-05-03 5 views
0

У нас есть this problem, который может быть поднят на рабочий процесс merge, поэтому мы рассмотрим вместо этого рабочий процесс rebase.Git rebase удаленной ветке с сохраненной историей

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

  1. Марку tag (могут быть имена branch_rebaseXXXXXXXX где XXXXXXXX отметка времени) на ветке вы собираетесь перебазироваться
  2. раздвинуть tag
  3. Применить rebase
  4. Push

Git может помешать вам выполнить rebase на пульте дистанционного управления, даже если вы следовали вышеприведенному сохранить историю. Вместо git push --force хака, мы можем сделать

  1. Создать новую ветку branch_new на вершине branch
  2. Марк тег, как описано выше
  3. Rebase новый филиал
  4. Нажмите новый филиал и тег
  5. Удалить старый местный и удаленный branch
  6. Переименуйте branch_new в branch
  7. Нажмите на изменение отраслевых имен

При применении этого подхода и использует только rebase не merge строго от начала, хотя в результате совершения истории не будет линейным, но так как там не будет никаких слияний, это будет эффективно формировать древовидный граф, где каждый листовой узел является либо концом активной ветви, либо помечен тегом. Лично я бы назвал эти метки «надгробными камнями».

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

+0

Похоже, что все, что вы сделали, смутило проверку '--force'. Чистый эффект - это то, что важно, и оно идентично силе нажатия на пересылку, поэтому имеет тот же эффект на всех, кто вытаскивает репозиторий. – user3710044

+0

Да, это может быть то же самое, что и «-force», но дело здесь в том, что, помечая ветвь rebasing, оно позволяет избежать частичной истории уничтожения в публичном репозитории. Это важно, так как переустановленные коммиты будут отличаться от исходных, если есть какие-либо конфликты для решения. ИМХО, что 'rebase' позволяет удалить оригинальные коммиты, является ошибкой дизайна. –

+0

Кроме того, все же стоит использовать обходной путь. 'git push -force' может быть ужасным, если вы только что забыли использовать' git tag'. Таким образом, следуя вышеприведенным шагам, хотя это сложнее, эффективно снижает риск совершения неправильной вещи. –

ответ

1

У меня недавно была ситуация, когда кто-то бросил всю историю с плохим push --force, поэтому я не увлекаюсь вашим обходным решением.

Хорошо, для whatever reason Вы хотите, чтобы ваша официальная история была линейной. Но вы по-прежнему нуждаетесь в полной видимости для некоторых рабочих ветвей.

Вы хотите филиал pu.

Разветвление «Ожидающие обновления» постоянно переустанавливается, вы вставляете в конфигурацию пульта, что эта ветка всегда будет принудительно нажата. На сервере у вас есть возможность добавить скрипт для создания ссылки (возможно, для тега не может быть ни тега, ни ветки), если он не является быстрым нажатием. Каждому пользователю (или группе) нужен собственный филиал pu.

Мастер-ветка обновляется ТОЛЬКО с быстрым переходом и только с простыми коммитами, без слияний.

Кто-то (будет решено) берет на себя обязательства, если потребуется, и добавляет их (вишневый)? На главную ветку. Этот человек НЕ делает слияния, слияние (физически это будет исправление rebase) происходит на ветвях pu не здесь.

Это кто-то может сделать что-то еще ... тестирование. Они добавляют патчи к их собственной ветке «тестирования», если тесты успешно выполняются, мастер быстро перенаправляется. Если тесты не пройдены, тестовая ветка делится пополам, а неудачный патч (или патчи) возвращается отправителю до повторного тестирования.

О автоматически созданных ссылках git отлично справляется с огромным количеством ссылок, но мне кажется, что у меня короткое время истечения срока действия. Этого вполне достаточно, чтобы просто включить reflog на сервере. OTOH, если вы действительно хотите сохранить их навсегда merge -s ours на филиале work-history, сделайте для впечатляющего log --graph без каких-либо других необходимых ссылок.

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

+0

Я не вижу никаких реальных возражений в вашем посте. Да, вы описали сценарий здесь, но это не кажется вредным для ** ЛЮБОГО ** способа. Единственное, что кажется отрицательным, - это огромное количество ссылок ... имеют короткое время истечения срока действия *, но это незначительная проблема. Во всяком случае, просто включение 'reflog' не помогает, потому что оно не видно клиентам. Мне нужно, чтобы ссылки были видны, и поэтому люди могут видеть это и понимать, что произошло. –

+0

Другое дело, что * вам нужна фиксированная точка ... * и я согласен. «Надгробные плиты» в моем предложении играют роль фиксированной точки истории. Люди не должны пытаться их перемещать, переименовывать или удалять, поскольку они являются частью истории. –

+0

Ум, нет, ваши ссылки на надгробные плиты являются указателями на то, что * уже изменилось *, будут коммиты, которые находятся между надгробием ref и базой слияния с хозяином, покидающим здание. Вам нужно будет заморозить мастера (например, использовать ожидающее обновление), если вы хотите быть уверенным, что каждая фиксация, покидающая здание, находится в прямой истории мастера, и поэтому ее можно легко делить пополам. Если вы используете свои надгробные плиты, вам нужно будет хранить все надгробные плиты, которые могут содержать опубликованные коммиты. – user3710044