2011-05-27 31 views
5

在我們的項目中,我們儘量貼近「正式」的git的工作流程,因爲它是這裏建議: http://www.kernel.org/pub/software/scm/git/docs/gitworkflows.html如何處理使用git主題分支工作流時的依賴關係?

我們用masternext分支,開始我們的話題分支從master,經常做測試融入next,如果分支完成,我們將它合併到master

現在有時會發生,topic-X有一些發展。開發人員創建somefile.c並在其中添加他需要的代碼。過了一段時間,另一位開發人員在topic-Y上工作,發現他還需要創建somefile.c,甚至需要topic-X中該文件的某些部分 - 但不包含完整文件,因爲它還包含僅與topic-X相關的代碼。他可能還必須將其他代碼添加到該文件。

如果topic-X將完成併合併到master,這很容易:我們可以將topic-Y重新指定爲master以使該代碼可用。但是,如果兩個主題仍然不完整?

因爲topic-Xtopic-Y真的是不相關的,除了在somefile.c這個小的共享代碼,我們如何才能避免它們相互融合並仍然提供兩種開發與somefile.c共享的部分?

如果我們創建的somefile.ctopic-Y一個新的副本,只有相關的部分,我們發現,我們得到後合併衝突,當我們做集成測試中next。有其他選擇嗎?

回答

1

合併時,git會檢測提交中的更改是否已應用。

因此,當您在topic-x中提交的更改somefile.c(您還需要在topic-y中)時,您可以在topic-y中挑選該提交。 (使它容易對自己,保持這個承諾僅限於你想要共享的東西。)

git checkout topic-y 
git cherry-pick topic-x 

當您合併topic-xtopic-y上之後,git會看到該補丁已經被應用,並優雅地跳過它。

這是一個更好的選擇比rebasing,因爲如果分支已經公開給多個開發人員,rebIN具有令人討厭的副作用。

+1

也許是最好的辦法。但是它要求在'topic-X'中有一個純粹的提交,它只添加'somefile.c'中的基本內容。在我們的例子中,依賴關係並不容易預見,所以沒有這種原子性的共鳴。 – 2011-05-29 11:04:27

+0

@Michael在所以有關於如何[櫻桃只挑選部分提交]的提示(http://stackoverflow.com/questions/5717026/how-to-git-cherry-pick-only-changes-to-某些文件)。 – 2011-05-31 12:09:11

1

最好在分支中合併X和Y的公共基數,並在該分支上基於topic-xtopic-y。那麼最佳情況下,兩個分支都不會再碰到somefile.c,而只說somefile-x.csomefile-y.c

或者像topgit更先進的工具可以幫助你(或不:-))

+0

這就是我們儘可能的嘗試。但是有時候我們會發現,到了晚些時候,話題-X已經看到了一些進展。我們只能將'topic-X'分成2個分支 - 這又是非常麻煩的。 – 2011-05-29 11:01:46