Git и работает на нескольких ветках - PullRequest
42 голосов
/ 26 августа 2009

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

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

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

Ответы [ 6 ]

53 голосов
/ 27 августа 2009

Есть два решения, которые не были упомянуты, и которые вы можете использовать: используйте ветку темы или используйте cherry-picking .


Тема ветки решения

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

$ 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).


Вишня - исправление ошибки

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

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

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

$ git checkout experimental
$ git cherry-pick A

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

5 голосов
/ 26 августа 2009

вы могли бы:

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

и затем:

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

или

  • merge something если вас не волнует «презентация»:)
2 голосов
/ 26 августа 2009

, так как ваша экспериментальная ветвь имеет функции из что-то , вы должны выполнить одно из:

  • объединить что-то в экспериментальный после того, как вы исправите ошибку там.
  • перебазировать ваш экспериментальный поверх что-то
0 голосов
/ 26 августа 2009

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

0 голосов
/ 26 августа 2009

Ваши ветки так или иначе связаны так:

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

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

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

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

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

0 голосов
/ 26 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...