我们为功能使用分支,然后将其合并到master
。我们还使用分支版本。但是,我有一个特殊功能(合并到master
),需要进入版本分支。以前,我一直在使用cherry-pick
(手动提取一次提交一个),但此功能有太多提交,一次只能提交一个。还有更好的方法吗?
此功能已合并到master
。该分支不再在本地存在。但是,我确实有将其合并到master
中的提交。
我能够恢复feature-branch
(因为我们使用GitHub)。但是,从版本分支开始,当我运行git merge feature-branch
时,我会收到与该功能无关的各种冲突。如果我git rebase feature-branch
(来自version-branch
),也会发生同样的事情。
答案 0 :(得分:2)
您的历史记录可能如下所示:
*--*--X--Y---------------* [master]
\ \ /
\ *--*--*--*--A [formerly feature-branch]
\
*--*--* [version-branch]
容易的部分是feature-branch
回来;只需弄清楚提交哈希A
并执行:
git checkout -b feature-branch A
但是,如果version-branch
在 master
之前feature-branch
分支(如上所示),则您不想直接做git merge
或git rebase
,因为这也会带来提交X
和Y
。相反,请执行--onto
rebase:
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
在rebase完成后,您可以像往常一样合并到version-branch
。
如果您在rebase期间遇到任何合并冲突(或version-branch
在master
或之后feature-branch
分支feature-branch
并且您仍然遇到冲突),那么您将不得不处理与他们一起,因为这意味着冲突发生在version-branch
的提交和{{1}}的提交之间。
答案 1 :(得分:0)
您将在版本分支中获得合并冲突,因为功能分支基于主分支,而(较旧)版本分支具有不同的历史记录(樱桃选择提交,合并等)。 在当前的功能分支中,如果它基于master,则会有来自其他未合并功能的其他提交。所以我希望这将是一个很难解决冲突的工作。
我认为你甚至不能反思。如果将版本分支重新绑定到功能分支的基础,则会选择合并,并且将再次应用版本分支的旧解决冲突并导致新的冲突。
所以在我看来你的过程是错误的。如果要将新功能应用于旧版本,则功能分支必须基于最旧的版本分支。否则,您可能会更改新功能中的代码,而这些功能从未成为旧版本的一部分,因为它仅合并到主版本。
我建议为版本(forks)创建不同的存储库,而不是使用分支进行版本控制。它使维护更容易。 要将该功能应用于其他版本,请在完成实施后将其推送到功能分支中的目标版本存储库。然后,您可以在代码中进行必要的更改,解决冲突等,并将其合并到版本库的主服务器中。
希望有所帮助。