2012-06-26 60 views
1

再過幾天,我必須做出一個複雜的承諾,我會盡量詳細解釋:的Git複雜的合併(後從SVN遷移)

我們使用GIT(從SVN遷移後),並有3個工作分支機構:

  • 幹線 - 立即更改/修復,開發者的遊樂場分公司等
  • 試製 - 分支,所有的功能,客戶端測試進行
  • 生產 - 這個名字說明了一切,工作產品的分支

所以平時開發商去這樣的序列:

新票 - >本地副本 - >幹線 - >試生產 - >生產

非常標準,我想。

現在,對於本身的問題: 在主幹中我們有一個完成任務(1000+小時)的地獄,那是在從svn遷移之前存在的,所以它不是git-branched或者類似的東西,這只是一堆提交。我們需要將該任務合併到預生產中,然後相應地生產分支。

我不能確定什麼是最無痛苦的做法。我甚至不確定分支在遷移之後是否有共同的祖先提交。

有沒有一種常見的方法可以解決問題?也許我可以將與此任務相關的提交分組到分支,然後將此分支與前置和生產合併?

任何建議非常感謝。

回答

2

如果您需要一個祖先提交(始終是一個好主意IMO),您可以使用SVN找到trunk和preproduction/production最後相同的實際分支點,然後找到相應提交的SHA1 git中的預生產分支,並執行此操作:

git checkout -b temp trunk // Don't use trunk itself in case it breaks 
git rebase <SHA1 goes here> // Rewrite the commits as changes from that SHA1 
// Possibly fix some conflicts 
// Verify manually that you have the code you expect 
git branch -m trunk old_trunk // Move old trunk aside 
git branch -m temp trunk // Here's the new trunk! 

這將使樹幹分支出預製。您可以重複一遍,以便預生產也可以支持生產。

爲了乾淨地將它們合併,打開git的rerere(這樣你解決任何衝突的方式被記錄,並自動當您合併生產前投入生產重複使用),然後執行:

git checkout preproduction 
git merge --no-ff trunk 

這將進行合併提交(不快進),以便您可以看到該功能的起始和停止位置,而不是一長串提交。它也會使主幹分支保持原樣,因此您可以繼續提交以準備合併下一個功能。

我們用來管理這個過程的模型是git-flow,這聽起來很像您所描述的工作流程,所以我建議您檢查一下,以及command line tools以支持它。

另外,如果您希望對提交進行分組,我會探索使用rebase將它們從主幹流中提取出來,並將它們作爲非快進合併,以便您可以查看特定功能的起始位置和結束。

1

我傾向於分支生產,然後與這個新分支合併。然後可以解決任何問題,最後這個分支將成爲一個新的預生產,然後可能最終合併回生產或取決於歷史,成爲生產2.有一系列的Git教程http://www.ava.co.uk/git和一個合併。他們可能是你已經知道的東西,在這種情況下,我是appologise,或者他們可能足夠清晰,讓你對你選擇的方法有信心。 HTH