2013-04-09 4 views
2

В настоящее время я работаю над проектом с использованием git. В принципе, мое мерзавец дерево состоит из трех ветвей:Как справиться с проблемой исправления с git?

  • Отделения : Происхождение ветвь, из которой вытекает мою работу.
  • Отрасль B: Филиал на основе A. B содержит разработки (новая функция для A).
  • Отрасль C: По причинам управления временем я также начал разработку неполных экспериментальных вариантов для новой функции. Этот экспериментальный код был добавлен непосредственно в B. Таким образом, C - это ветвь очистки для B, только сохраняя полностью действующий код.

Ветка отношения могут быть представлены таким образом:

голова ->B ->совершают 0 -> ... ->совершить п ->C ->очистка фиксации

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

Код в отрасли C чистый, и я хочу подделать патч от него. Патч должен включать все изменения от последнего фиксации C до Головка.

Если я сделаю git format-patch master --stdout > my_patch.patch, это приведет к патчу, который эффективно завершит рабочий код. Но это не нормально, так как в патче добавляется экспериментальный код (через некоторые коммиты в B), а затем удаляется (очистка фиксируется в C). В дополнение к тому, чтобы не быть умным вообще, это также включает бесполезное дополнительное пространство (что означает дополнительную почту для совместного использования патча с сообществом) и дополнительные накладные расходы в приложении.

Как я должен работать на этих ветвях для получения чистого патча? Обратите внимание, что я хочу сохранить экспериментальную работу, сделанную до сих пор в филиале B, я просто хочу не включать его в патч.

+1

Есть ли конкретная причина, по которой вы не используете [cherry-pick] (https://www.kernel.org/pub/software/scm/git/docs/git-cherry-pick.html)? –

+0

@MohamedTarek Вы рекомендуете мне создать новую ветку, происходящую из __A__, а затем вишни - выбрать изменения, применяемые в __B__? Правильно ли я это понимаю? – Rerito

+0

Этот ответ может быть уместным, http://stackoverflow.com/a/1624723/ – Hasturkun

ответ

1
git checkout C    # alternately, do "git checkout -b C_NEW" for safety 
git rebase --interactive A # Your A branch 

Он выведет редактор. Измените весь текст «pick» на «s», кроме первого. Это будет «хлюпать» все ваши фиксации в одну фиксацию.

Возможно, вы также использовали вишневый выбор (чтобы вытащить несколько коммитов на A), или git rebase --interactive (и удалили все B, чтобы получить C).

+0

На самом деле, я использовал комбинацию 'git rebase -i' вместе с' git reset HEAD ~ 'в каждой« серой »фиксации, чтобы разделить их, а затем трюк« squash ». Я искал ответ, который пощадил бы меня, чтобы положить руку в дерьмо, но эй ... Если я испортил вещи, я бы не ожидал, что они сами займутся собой. Во всяком случае, так как ваш ответ показывает достаточно хорошую процедуру, которую я последовал, я принял ее! – Rerito

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