2010-05-24 60 views
5

我有一個系統的5個分支 - 讓我們稱他們爲主人,倫敦,伯明翰,曼徹斯特和演示。這些僅在配置文件中有所不同,並且每個都有自己的一組圖形文件。如何在Git中管理多個開發分支?

當我做一些開發時,我創建了一個來自master的臨時分支,在該功能之後被調用,並且在其上進行工作。準備合併時,我將結帳主文件和git合併功能引入到我的工作中。這似乎工作得很好。

現在我需要將我的更改導入其他分支,而不會丟失它們之間的差異。我怎樣才能做到這一點?對於伯明翰獲得倫敦圖形和配置文件中的衝突,我一直沒有遇到任何問題。

當分支最終正確時,我將它推到一個軟件倉庫,並將每個分支下拉到一個Linux盒子進行最終測試,從那裏開始使用rsync(設置爲忽略.git倉庫本身)。這個階段工作得很好。

我此刻的唯一開發商,但我需要獲得邀請過程中協助:)

回答

4

git rebase是你的朋友面前固體。

像以往一樣在您的主分支中進行更改。完成後,結賬一個其他分支(比如伯明翰)並運行 git rebase master。 git會在你當前的提交和伯明翰所依據的提交之間進行你所做的更改。 interweb上的命令有很好的文檔。這裏有兩個我發現

http://darwinweb.net/articles/86

http://www.eecs.harvard.edu/~cduan/technical/git/git-5.shtml

還有許多其他問題。你會發現許多人在談論重組的危險。注意這些擔憂,但我懷疑這些好處大大超過了你案件中的風險;並且知道危險是戰鬥的一半。

+0

正如你所說,「git rebase master」解除了HEAD和master的共同之處。在git rebase master涉及19次提交,其中12次出現了衝突之後,我開始尋找替代方案。 我該如何避免這條路線每次越來越長? – Ian 2010-05-24 13:06:59

+0

請注意,使用'git rebase',你會失去你以前的分支狀態!如果您分發倫敦提交然後重新分支分支,您將無法返回到此狀態。 – Gauthier 2010-05-25 11:24:27

+0

正確的,這是反覆提到的'git rebase'的危險。我會聲稱這並不總是一件壞事。一旦你做了rebase,那麼合併就完成了,你不必再次處理它們(和合並一樣)。 OP在提交中保持衝突的事實指向代碼組織和流程問題,而不是方法問題。子模塊在我們正在研究的情況下將完成同樣的事情,但仍然需要比當前顯然發生的更仔細的過程和代碼分離。 – McBeth 2010-05-25 14:38:40

10

兩種技術可以幫助:

  • submodules:如果你有5個 「主項目」,每一個組成:
    • 通用代碼(其中獲得功能增強後的功能)
    • 特殊代碼(特定圖形文件或配置值,每個站點一套)
  • template config files

因此,當您開發一項新功能時,您需要爲其他網站從中受益而做的是確保它們各自的repo將最新的通用代碼回購作爲子模塊引用。只需要git submodule update即可完成。

此外,使用模板配置文件,您正在存儲的所有配置,而不是實際的配置文件本身(它們會生成)。
這使您可以在每個站點上進行一些微調,而不必「忽略」本地修改。

結論:不是試圖在一個回購管理所有方面(公共代碼,配置文件,特殊文件,...)(所有的合併和底墊,這將涉及到),嘗試模塊化應用程序。

+0

[git-submodule] +1(http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html)。 – Santa 2010-05-25 06:25:42

1

另一種方法:

一旦你的新功能是master,合併回主人到所有其他相關分支機構。

原始狀態:

o---o-master 
    \ 
    o-London 

新犯主:

o---o---o-master 
    \ 
    o-London 

合併的新功能集成到倫敦分公司,git checkout London; git merge master:但是,這可能

o---o---o-master 
    \ \ 
    o---o-London 

注很麻煩,特別是如果分支數量增加的話。 我對你的系統一無所知,但是如果你可以在一個分支中擁有所有的配置,它可能會更容易(我的意思是讓所有五個配置文件和圖形文件始終存在於你的文件系統中)。

例如,使用makefile,您可以根據當前目標配置選擇要編譯和鏈接的源文件。在你的情況下,makefile可以幫助你將圖形文件和配置文件與目標配置關聯起來。

如果能夠在沒有任何結帳的情況下構建所有配置,那也不錯,不是嗎?

+0

您的方法可能存在的問題是我必須添加新圖形。更新主人和倫敦 - 然後合併。我該得到什麼?然後,我需要在主人中更改圖片,但不是倫敦。我這次得到哪個?不倫敦! 結論 - 對每個安裝的獨特位和回放進行開發回購。使用makefile將每個版本從倫敦和開發倉庫彙編到最終測試位置,並將其部署到生產站點。源代碼,配置,部署過程和makefile都受版本控制。 :) 我只需要找到生成makefile的時間。 – Ian 2010-05-25 15:38:04