2010-01-31 67 views
23

我們有項目(PHP應用程序),但每個客戶端的安裝會有所不同,有時很少,有時甚至更多。儘管如此,源代碼的很大一部分是很常見的。我們將特定安裝作爲並行分支管理到主分支,我們需要將更改從主分支轉移到其他分支。同樣的情況在Git: how maintain (mostly) parallel branches with only a few difference?解決的最投票的解決方案是這樣轉移設有分公司之間的變化:Git:如何維護永久並行分支

git pull 
git checkout local 
git rebase master 

如在方案中提到它創建非快進墊底後推,我覺得非常不愉快的併發症。我的問題是 - 爲什麼不這樣做,而不是:

git pull 
git checkout local 
git merge master 
+0

也許你的意思呢? http://stackoverflow.com/questions/2850369/why-does-git-use-fast-forward-merging-by-default – cregox 2012-05-16 17:03:33

回答

5

這真的取決於你想要做什麼與分支。是的,如果你在本地進行重組,它會在重新綁定後創建非快進。另一方面,你會保持一系列不同的變化,你的分支上的變化將會是一系列變化,如果他們已經變成了最新的掌門人。

將主人合併到本地,而是保持本地人與主人及時向前行進,並記錄發生的歷史記錄。如果你需要能夠重建過去的本地狀態,那麼你會想做到這一點。歷史將永遠不會改變。但是,你將有更復雜的歷史來處理。

+0

在我的團隊中,我們(幾乎總是)重新綁定任何將要重新合併的分支。經常儘可能地讓rebase變得更容易。這簡化了您回來後對變更歷史的理解。 當我們必須同時維護兩個分支並且釋放兩個分支時(維護和開發版本等) - 那麼我們不能再分配,這太混亂了。我們開始合併。 – 2010-01-31 02:12:21

2

Greg's answer您的其他問題似乎查看不同分支機構其餘地方以特定的安裝,而不是推到其他回購(強調):

如果它是本地系統,將其提交到該系統的「本地」分支,否則將其提交到「主」並將其推送到公共存儲庫。

你幾乎總是希望快進到共享庫中的分支。 git rebase documentation解釋瞭如何從上游rebase(,即,git rebase,然後git push -f)恢復,對任何參與者都沒有好處。

對於另一種方法,請參見Never merging back

有有效的情況下,你曾經有意向叉從不合並回去,但一般而言,您應該儘量很難保持這樣的叉的變化最小。

作者繼續在同一個存儲庫中討論各種客戶版本的分支策略。

17

這個想法是你使用一個共同的分支,和兩個(或多達你需要的)客戶特定的分支。所有常見更改都會進入 主數據庫,並且每個客戶分支機構都會獲得僅與該客戶的 有關的更改。定期(當主人被認爲是在 穩定點),您將合併更改從主人到客戶 分支(git checkout custA; git merge master)。這會在客戶分支中引入更新的「常見」代碼 。你永遠不會合並其他 的方式 - 這會污染主客戶特定的代碼。

當您向客戶A交付貨物時,您會簽出「custA」 分行併發送該分行。當然對於其他客戶也是如此。

現在我們假設您獲得一位新客戶「C」,稍後找到客戶A和C需要的 功能,但B不需要。您創建(也稱爲「fork」)關閉主(git checkout -b AC_feature master), 代碼/測試它的分支,隨時進行提交,然後將其合併到A和C (git checkout A; git merge AC_feature and similarly for customer C)中。 你不要在它的代碼,然後依靠合併成一個C,因爲 ,將得到所有A到C.

如果一段時間後,你會發現在該功能一個小錯誤,你讓 在同一分支(git checkout AC_feature; edit/test/commit), 中更改,然後如上所述將它合併到custA和custC中。

來源:從Gitolite的開發商,這些令人耳目一新的明確的和有益的文章 - Sitaram Chamarty,寫的部分與朱尼奧·哈默諾直接輸入(Linus Torvalds的維護Git的合作伙伴)。

維護並行的顧客分行:

http://gitolite.com/archived/special-branches.html

的 「固定Up」 的公用和客戶分行在下一篇文章:

http://gitolite.com/archived/special-branch-fixups.html