В Git, как применить коммит исправления ошибки к другим более новым веткам? - PullRequest
3 голосов
/ 22 июля 2010

Если у меня есть публичный репозиторий Git, который содержит 3 ветки, подобные следующим:

  (release-to-customerA)
      |
      U               (master)
     /                    |
A---B---C---D---E ... S---T 
        |
    (release-to-customerB)

, где commit 'B' был исходной версией выпуска, а commit 'U' исправил некоторые ошибки в 'B'.Я хочу применить коммит 'U' к ветке master и release-to-customerB , а также в следующий раз, когда я предоставлю новую версию клиентам на основе коммита 'D ',' E ', ...' T ', я хочу включить коммит' U '.Какой самый чистый способ сделать это?

Я знаю, что git rebase или git cherry-pick могут добиться цели в моем локальном репозитории, но я испорчу историю, когда я отправлю перебазированную работу в открытый доступхранилище?

Спасибо за ответы.

Ответы [ 3 ]

5 голосов
/ 22 июля 2010

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

  (bugfixB, releaseA)
        --------------------- Y (master)
       /                     /
      U---X (releaseB)      /
     /   /                 /
A---B---C---D---E ... S---T

Обратите внимание, что я добавил название ветки bugfixB - это очень общая идея. Коммит U должен быть сделан на ветке, цель которой - исправить B (это может быть несколько коммитов). Затем эта ветвь должна быть объединена со всеми ветвями, для которых требуется исправление ошибки, в данном случае - releaseA, releaseB и master.

 git checkout -b bugfixB <SHA1 of B>
 # fix things, add changes
 git commit

 # for each branch...
 git checkout releaseA
 git merge bugfixB
 git checkout releaseB
 git merge bugfixB
 git checkout master
 git merge bugfixB
0 голосов
/ 22 июля 2010

В этой ситуации не следует делать перебаз, поскольку очевидно, что другие люди видели коммиты от C до T.

Как сказал Грег, вы можете использовать git-cherry-pick, чтобы получить только U; но это создаст новый коммит с тем же diff, но с другим идентификатором. Если вы хотите получить все коммиты в выпуске для покупателя А в выпуске для покупателя и мастера, вы можете использовать git-merge примерно так:

git checkout release-to-customerB
git merge release-to-customerA

git checkout master
git merge release-to-customerA
0 голосов
/ 22 июля 2010

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

git checkout release-to-customerB
git cherry-pick U
git checkout master
git cherry-pick U

Вишневый сбор только создает новый коммитов и не переписывает историю, поэтомуэто всегда безопасно, даже если вы позже отправите в другой репозиторий.

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