2017-02-03 108 views
0

我們使用分支功能,然後我們合併到master。我們也使用分支版本。不過,我有一個特殊的功能(合併到master)需要進入版本分支。以前,我一直在使用cherry-pick(手動拔取一次提交一個),但是此功能提交的提交次數過多。有沒有更好的辦法?在另一個分支中合併Git中的功能?

此功能已合併爲master。該分支不再在本地存在。但是,我確實將它合併爲master

我能夠恢復feature-branch(因爲我們使用GitHub)。但是,從版本分支中,當我運行git merge feature-branch時,出現與該功能無關的各種衝突。同樣的事情發生,如果我做git rebase feature-branch(從version-branch)。

+0

這是合併到主推到遠程還是所有本地? – castis

+0

看到我更新@castis –

回答

1

歷史會是這個樣子:

*--*--X--Y---------------* [master] 
    \  \   /
    \  *--*--*--*--A [formerly feature-branch] 
     \ 
     *--*--* [version-branch] 

容易的部分是越來越feature-branch回;剛剛弄清楚提交哈希A做:

git checkout -b feature-branch A 

但是,如果version-branch分支的masterfeature-branch之前沒有(如上圖所示),你不想做直git mergegit rebase,因爲那也將引起提交XY。相反,做一個--onto底墊:

git rebase --onto version-branch Y feature-branch 

爲了更容易找到Y,你可以這樣做:

git merge-base master feature-branch 

或者全部在一個命令:

git rebase --onto version-branch $(git merge-base master feature-branch) feature-branch 

底墊的後完成後,您可以像往常一樣合併到version-branch


如果你得到的底墊中的任何合併衝突(或者,如果version-branch在或之後feature-branch做了,你仍然得到衝突分出master),那麼你將不得不對付他們,因爲那意味着衝突介於feature-branch的提交和version-branch的提交之間。

+0

你能不能也做'git的櫻桃採摘-m 1 '其中'MC'是合併提交其帶來的'功能branch'到'master'的? – frans

+0

@frans:我不確定我的頭頂,但它嘗試不傷。 –

0

因爲功能分支是基於主版本,並且(舊版本)版本分支具有不同的歷史(櫻桃挑選的提交,合併等),所以您將在版本分支中獲得合併衝突。 在您當前的功能分支中,如果其他未合併功能基於主設備,則會有額外的提交。所以我期望這將是很多艱難的衝突解決工作。

我認爲你甚至不能變身。如果您將版本分支重新綁定到功能分支的基礎,那麼櫻桃挑選的合併和您的版本分支的舊解決衝突將再次應用並導致新的衝突。

所以我認爲你的過程是錯誤的。如果您希望將新功能應用於舊版本,則功能分支必須基於最舊的版本分支。否則,您可能會更改您的新功能中的代碼,該功能從來不是舊版本的一部分,因爲它僅合併到主版本中。

我建議創建版本(叉),而不是使用分支的版本不同的存儲庫。它使維護更容易。 要將此功能應用於其他版本,請在完成實施後將其推送到功能分支中的目標版本存儲庫。然後,您可以在代碼中進行必要的更改,解決衝突等,並將其合併到版本回購的主文件中。

希望有所幫助。