在另一个分支中合并Git中的功能?

时间:2017-02-03 19:41:39

标签: git git-merge git-rebase git-cherry-pick

我们为功能使用分支,然后将其合并到master。我们还使用分支版本。但是,我有一个特殊功能(合并到master),需要进入版本分支。以前,我一直在使用cherry-pick(手动提取一次提交一个),但此功能有太多提交,一次只能提交一个。还有更好的方法吗?

此功能已合并到master。该分支不再在本地存在。但是,我确实有将其合并到master中的提交。

我能够恢复feature-branch(因为我们使用GitHub)。但是,从版本分支开始,当我运行git merge feature-branch时,我会收到与该功能无关的各种冲突。如果我git rebase feature-branch(来自version-branch),也会发生同样的事情。

2 个答案:

答案 0 :(得分:2)

您的历史记录可能如下所示:

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

容易的部分是feature-branch回来;只需弄清楚提交哈希A并执行:

git checkout -b feature-branch A

但是,如果version-branchmaster之前feature-branch 分支(如上所示),则您不想直接做git mergegit rebase,因为这也会带来提交XY。相反,请执行--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-branchmaster或之后feature-branch分支feature-branch并且您仍然遇到冲突),那么您将不得不处理与他们一起,因为这意味着冲突发生在version-branch的提交和{{1}}的提交之间。

答案 1 :(得分:0)

您将在版本分支中获得合并冲突,因为功能分支基于主分支,而(较旧)版本分支具有不同的历史记录(樱桃选择提交,合并等)。 在当前的功能分支中,如果它基于master,则会有来自其他未合并功能的其他提交。所以我希望这将是一个很难解决冲突的工作。

我认为你甚至不能反思。如果将版本分支重新绑定到功能分支的基础,则会选择合并,并且将再次应用版本分支的旧解决冲突并导致新的冲突。

所以在我看来你的过程是错误的。如果要将新功能应用于旧版本,则功能分支必须基于最旧的版本分支。否则,您可能会更改新功能中的代码,而这些功能从未成为旧版本的一部分,因为它仅合并到主版本。

我建议为版本(forks)创建不同的存储库,而不是使用分支进行版本控制。它使维护更容易。 要将该功能应用于其他版本,请在完成实施后将其推送到功能分支中的目标版本存储库。然后,您可以在代码中进行必要的更改,解决冲突等,并将其合并到版本库的主服务器中。

希望有所帮助。