2011-07-15 13 views
7

如果我們發現某些分支中的bug,我們修復它(檢查新的發佈在圖片上)。而且我們在此修復程序移動到釋放和主要開發分支有趣:如何在DVCS中的分支中移動錯誤修正?

 
a-->b-->c    (Old release) 
|  
A-->B-->C-->D   (Main release) 
    | 
    1-->2-->bugfix-->4 (New release) 

SVN記得的svn:合併特性(從SVN 1.6,2009年),其修訂合併到分支。因此,下次如果合併版本的區域,則合併修補程序會從合併修補程序中跳過。

如何處理現代DVCS?

我需要做一個普通的補丁,並將其應用到每個分支或存在DVCS的幫助嗎?

注意:我不能只是合併新領域,以主要如先前的變更也移動到主要領域。

Rebase也不可能作爲新版本發佈給許多開發者。

我有興趣回答命名分枝模式和多庫模式。

PS。Andy建議找到所有分支機構的共同家長,這些分支機構對其有影響,更新,修復bug並將修復移到受影響的分支。

通過更新舊的變更集並進行更改,您可以創建新的分支。我建議創建命名分支(將其命名爲bugID),以便稍後可以輕鬆地回到它。

找到我們有興趣修復錯誤的所有分支的共同父項存在問題。

首先溶液(暗示安迪)使用$ HG/git的/的bzr怪並仔細檢查輸出爲所有受影響的文件。這涉及到一些最新的變更集首先修復bug,然後再找到責怪什麼變更引入了一個錯誤。然後你需要rebase修復(補丁)到共同的父變更集。

另一種解決方案是使用$ hg/git/bzr bisect(您也可以手動執行更新以查找引入錯誤的第一個修訂版)。這可以是廣闊的,但更多true解決方案允許填充錯誤修正爲任何分支中存在錯誤。

我想還是先找到第一BAD變更,然後修正錯誤,而不是先修復bug,然後找到第一BAD變更(除情況下,當你已經知道如何修復的bug)。也有介紹差異可以幫助理解爲什麼會發生。

PPS。有了bug,很清楚哪個分支影響到允許合併更改到任何受影響的分支。

有趣的問題來問如何從開發分支backport功能發佈分支。如您所見,您必須提交在發佈分支之前以changeset開頭的功能更改集。但是,當你開發功能時,你可能不知道你需要什麼backport功能。用svn:合併 VCS記住你所有的backports。如何DVCS?

+1

git cherry-pick? –

+0

櫻桃挑選可能會導致您的歷史混亂,如果他們曾經合併回來。 – Andy

+0

@安迪:怎麼樣的困難? –

回答

7

,你可以:

  1. 找到共同的母公司。 感謝Novelocrat這一步。
    git merge-base branch1 branch2 branch3 ...

  2. 結帳共同父
    git checkout A

  3. 創建新的分支,以固定在
    git checkout -b bugFix

  4. 製作bug修復bug和它們提交到bug修正分支

  5. 結帳分支需要bu摹修復
    git checkout branchToApplyFixTo

  6. 合併缺陷修復進入分支
    git merge bugFix

+1

不錯。只有我看到的問題是計算與bugfix相關的所有**分支的共同父代。 – gavenkoa

+0

您可以使用'git blame'中的日期來查看錯誤何時被創建,並從那裏決定您的分支點。 – Andy

+0

感謝您的回答。我更新您的建議的問題。我還推薦使用** bisect **來查找常見的** BAD **父項。 – gavenkoa

2

你可以git cherry-pick bugfix上要解決每個受影響的分支。不過,這會爲每個分支上的修復生成一​​個新的提交ID。

1

這就是爲什麼人們爲每個功能或錯誤修復創建單獨的分支。然後唯一的技巧就是確保在創建分支時,從某個點上排除任何您不希望包含在您想要合併的每個分支中的提交。如果你忘記了,那麼在進行任何合併之前,你可以將它重新設置爲該點。如果你沒有捕獲它,直到它被合併回你的新版本分支,如你的例子所示,最好的選擇可能是櫻桃採摘,儘管如果你經常使用它,這可能會使未來合併非常困難。

+0

我認爲Git的合併應該可以處理櫻桃挑選,但我可以很容易地看到,如果不小心,它會如何產生粘性情況。 – Novelocrat