2013-02-08 3 views
3

Я работаю над проектом с Git и пришел к тому моменту, когда хотел разбить развитие на две отдельные ветки. Разделение касается простого изменения (с капиталом C, поэтому я могу вернуться к нему позже), который затрагивает одну изолированную часть кодовой базы - в одной ветке я хочу, чтобы Change присутствовал; в другом - нет. Это изменение инкапсулировано в одну транзакцию.Поддержание ветки, которая не содержит коммитов, связанных с определенным изменением

Ветвь master, где я выполняю все свое кодирование (если не задана конкретная тема) - это ветка, в которую я хочу сменить. Я хотел бы создать отдельную ветку, original (или что бы вы там ни называли), которая не содержит изменения.

master, ветка с изменением, останется основной, предпочтительной ветвью: это ветка. Я буду продолжать кодирование, и это ветка, код которой я на самом деле запускаю. Я хочу сохранить original на всякий случай, если мне нужна версия кода без вышеупомянутого изменения позже.

Возникла проблема: я хотел бы иметь возможность «объединить» работу с master в original по дороге, но, очевидно, только коммиты, которые не касаются изменения.

  • Если я простой git merge master, original будет Перенесемся в master, представляя изменение, которое я не хочу, не так ли?
  • Я не хочу развиваться на original и сливаться с master, потому что original - это особый случай, а не master.
  • Я не хочу cherry-pick от master, потому что это будет мутить мою историю развития.
  • Я мог бы создать новую ветку, develop, из фиксации, которая вводит изменение в master. Я мог бы совершать коммиты, не связанные с изменением, на этой ветке и легко объединить их в master или original. Однако, если я сделаю некоторые связанные с изменением коммиты на master и хочу объединить их в develop, то я снова не смогу безопасно объединить develop в original, не так ли?

Я хотел бы узнать ваше мнение о том, как лучше всего действовать.

EDIT: Я единственный человек, работающий над этим проектом, поэтому не исключайте решение, потому что это может испортить других программистов в условиях совместной работы. Я просто ищу простое в использовании решение, которое производит чистый, интуитивно понятный история, которая отражает то, что эти разные истории развития на самом деле. Если такого решения не существует, я приму один из ответов, которые выполняются.

ответ

3

Как насчет перехода от основной к исходной ветке, а затем git revert коммитов, которые содержат изменения, которые вы не хотите поддерживать в исходной ветке. Я думаю, git merge будет работать тогда. Просто, что сумма нескольких даже коммитов будет равна нулю.

+0

ОК, но что делать, если в будущем я сделаю больше изменений, связанных с изменением? Должен ли я возвращаться каждый раз, когда сливаюсь? – jobo3208

+0

Допустим, что у вас есть hash 'e35g5d' в master. Вы входите в оригинал, и у вас будет то же самое в оригинале. Когда вы запустите 'git revert', будет создан новый объект commit, который будет обратным к тому, что находится в' e35g5d'. Эта фиксация существует только в оригинале и может поддерживаться только в исходной ветви. Теперь, когда вы объединяете master, поскольку фиксация с хешем уже присутствует, git не воссоздает фиксацию в исходной ветви. Надеюсь, это прояснится. –

+0

+1: Да, это объясняет, спасибо. Мне не нравится идея возвращать фиксации каждый раз, когда я сливаюсь, но это решение работает. Я протягиваю немного дольше для более чистого решения. – jobo3208

1

мне понравился четвертый подход:

Я бы рекомендовал вам создать еще одну hotfix ветвь, откуда вы создали original ветвь.Оба филиала не будут содержать Change связанных коммитов, и вы можете смело объединить их в master и original.

Если вы хотите объединить несколько Change связанные фиксации на master с hotfix, а затем создать hotfix-with-change ветви от hotfix и объединить его там.

Если вы хотите, чтобы разработать не Change связанный код, который будет влиять на original и master, сделать это в hotfix и не забудьте обновить hotfix-with-change ветку, а также.

Если вы хотите, чтобы разработать Change связанный код, ваша ветвь должна быть master ветвью, и если вы хотите увидеть, что совершает в original, вам необходимо объединить, совершающий с hotfix-with-change.

Надеюсь, это было ясно.

+0

Спасибо за ваш ответ ogzd. Я выбрал ответ Гаурава, потому что это так просто, но мне, возможно, придется использовать что-то вроде этого в будущем. – jobo3208