Git и работа с несколькими ветками

У меня есть пара веток Git: «экспериментальная», «что-то» и «мастер».

Я переключился на "экспериментальную" ветку. Я заметил ошибку, не связанную с «экспериментальной», а относящуюся к изменениям, внесенным в «что-то». Как мне это исправить?

Я думаю, что мне следует переключиться на «что-то», исправить ошибку, зафиксировать, а затем вернуться к «экспериментальному». Как мне взять незначительное изменение из «чего-то» и применить его как к «основному», так и к «экспериментальному», чтобы мне не пришлось снова исправлять ошибку при переключении на эти ветки?


person Gav    schedule 26.08.2009    source источник


Ответы (6)


Вы можете использовать два решения, о которых еще не упоминалось: использовать ветку темы или использовать выбор вишен.


Решение тематической ветки

В решении ветки темы вы переключаетесь на ветку «что-то», создаете ветку для исправления ошибки, например. 'something-bugfix', слить эту ветвь с 'something' (исправление ошибки), затем слить эту ветвь с 'experimental'.

$ git checkout -b something-fix something
[edit, commit]
$ git checkout something
$ git merge something-fix
$ git checkout experimental
$ git merge something-fix
[fix conflicts if necessary and commit]

См. также Раннее разрешение конфликтов/зависимостей между ветками темы и Никогда не сливаться обратно и, возможно, также Коммит в другую ветку сообщения в блоге Junio ​​C Hamano (сопровождающий git).


Вишневый сбор исправления

Решение выбор вишни полезно, если вы заметили позже, что созданное вами исправление (например, в ветке разработки) будет полезно и в другой ветке (например, в стабильной ветке). В вашем случае вы бы исправили ветку «что-то»:

$ git checkout something
[edit, edit, edit]
$ git commit
$ git checkout experimental

Затем вы заметили, что исправление, которое вы зафиксировали в ветке «что-то», должно быть также и в ветке «experimenta». Предположим, что это исправление было коммитом «A» (например, «что-то», если вы ничего не коммитили поверх «чего-то», но это может быть, например, «что-то ~ 2» или «c84fb911»):

$ git checkout experimental
$ git cherry-pick A

(вы можете использовать опцию --edit для git cherry-pick, если вы хотите отредактировать сообщение коммита перед фиксацией выбранного исправления).

person Jakub Narębski    schedule 27.08.2009

вы могли:

  • stash или commit изменения, над которыми вы работали в experimental ветке
  • checkout something
  • (необязательно) bisect, чтобы найти ошибку
  • commit изменения
  • checkout experimental

а потом:

  • rebase something если вам нужен чистый график коммитов (если вы предоставляете этот репозиторий и вам это небезразлично)

or:

  • merge something если вас не волнует "презентация" :)
person Carmine Paolino    schedule 26.08.2009

поскольку в вашей экспериментальной ветке есть функции из чего-то, вам следует выполнить одно из следующих действий:

  • объедините что-то с экспериментальным после того, как вы исправите там ошибку.
  • перебазируйте свой экспериментальный поверх чего-то
person Vitaly Kushner    schedule 26.08.2009
comment
+1: я переключился на ветку, содержащую исправление, зафиксировал его, а затем перебазировался на master во всех остальных ветках; теперь все ветки содержат фикс. Это желаемый результат. Спасибо! - person Gav; 26.08.2009
comment
имейте в виду, что перебазирование создает проблемы для других людей, если они извлекают данные из вашего репозитория. - person James Cassell; 07.10.2009

Если вы не слишком продвинулись в «мастере», просто вернитесь к экспериментальному и выполните «git merge master». Если вы это сделаете, я думаю, что команда «git cherry-pick» — ваш друг.

person ondra    schedule 26.08.2009

Ваши ветки как-то связаны вот так:

мастер > что-то > экспериментальный

Это если вы действительно собираетесь что-то слить в master.

Я бы, если возможно, исправил его поверх мастера, а затем перебазировал остальные поверх мастера. Но мне просто нравится перебазировать. Или вы могли бы исправить это там, а затем слить точно так же

мастер > что-то > экспериментальный

но если что-то простая ветка темы, я бы этого не делал. Вот это звучит как-то ваш "кандидат в следующие мастера"

person u0b34a0f6ae    schedule 26.08.2009

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

person William Pursell    schedule 26.08.2009