2014-10-30 154 views
2

我的團隊一直在關注master的原型分支。我現在想要做這件事,將它分成不同的「功能分支」,並將它們分別合併到主控中。我看到有幾種方法可以做到這一點,我也不太喜歡這兩種方法:獨立的git分支分爲多個分支以合併爲主

1 - 創建一個新分支Feature_1,關閉主人。將原型中的代碼手動複製到Feature_1。這意味着我必須跟蹤我在製作Feature_N時丟失的歷史記錄。

2 - 創建一個新分支Feature_1,關閉原型。以某種方式恢復不屬於Feature_1中第一個功能的代碼。這樣可以避免撒謊(並保留歷史記錄),但感覺像Feature_N將合併成一團亂麻,因爲我會告訴主要人員,當我推送Feature_1時,這些更改已被還原。

我錯過了一個更好的方法來做到這一點?

回答

3

創建兩個分支feature_1feature_2master和櫻桃挑提交從prototype的有關特性分支:

git checkout -b feature_1 master 
git cherry-pick <commit> 
git cherry-pick <commit> 
… 

git checkout -b feature_2 master 
git cherry feature_1 prototype | grep "^+" | cut -c3- | xargs git cherry-pick 

最後一行櫻桃挑選都是從prototype提交其不在feature_1到當前分支,即feature_2

當您遇到衝突時,請使用git status提示如何繼續。

請參閱git-cherry-pick瞭解更多文檔。

+0

我們實際上已經拿出摘櫻桃以及在這裏討論的時候,我會嘗試。 – JoeB 2014-10-30 17:27:39

+0

如果沒有提交任何更改,是否有辦法做到這一點? – Michael 2018-02-06 20:31:17

+0

創建一個新的分支,使用'git的添加--patch'添加想要有變化,這個分支(+'git的add'新文件),提交,藏匿剩餘的變更,籤一個新的分支基於主('git checkout -b feature_2 master'),添加並提交您的更改。 – Michael 2018-02-07 09:40:10

5

@邁克爾的答案是好東西,如果你的提交是單功能提交,不提供任何其他功能的提交依賴關係。但是,如果您在任何提交中混合使用了這兩個功能,則需要interactive rebase。它允許您任意重新分配變化區塊並提交邊界,並且它可以跟蹤哪些區塊尚未提交給當前分支。

如果功能更改有時會合併爲提交併且沒有交叉功能依賴關係,爲了讓生活更輕鬆,我的第一次嘗試是git rebase -i master prototype,將混合區域提交拆分爲兩個提交,每個提交一個,然後像邁克爾的回答那樣結束櫻桃選擇。鑑於

A1-B2-C12-D2-E1-F12 prototype 

,其中數字表示該功能(S)的承諾中包含的代碼,用於`git的重訂-i主原型你編輯提交C12和F12,

pick A1 
pick B2 
edit C12 
pick D2 
pick E1 
edit F12 

(使用每提交的哈希,而不是它的說明標籤在這裏)。

C12衍合後會停止,您可以git reset HEAD~然後git add --patch應用所有功能-1帥哥,git commit --amend創建提交C1C12之地位,然後git add -A; git commit`` to apply all the remaining hunks and create commit C2`跟隨它。你會以

A1-B1-C1-C2-D2-E1-F1-F2 

然後你可以git checkout -b feature1 master; git cherry-pick A1 B1 C1 E1 F1和類似的功能2。

在更復雜的情況下,這種方法仍然作品只有非常輕微的變化。互動變基大大優於上述可能導致你相信,但迄今爲止最好的方式來了解這是當你在那裏得到和爭搶一些帥哥的樂趣坐下來與the manpage。做到這一點,它可能很快就會到達這樣一個地步:作爲預先發布儀式做這件事通常足夠比試圖讓您的實際工作流程在每一個小步驟都可以發佈更爲方便。