在另一个分支中合并 Git 中的功能?
Merge features in Git in another branch?
我们对特征使用分支,然后将其合并到 master
。我们还为版本使用分支。但是,我有一个特殊功能(合并到 master
)需要进入版本分支。以前,我一直在为此使用 cherry-pick
(一次手动提取一个提交),但此功能的提交太多,无法一次完成一个。有没有更好的方法?
此功能已合并到 master
。该分支在本地不再存在。但是,我确实有将其合并到 master
.
中的提交
我能够恢复 feature-branch
(因为我们使用 GitHub)。但是,在版本分支中,当我 运行 git merge feature-branch
时,我得到了与该功能无关的各种冲突。如果我做 git rebase feature-branch
(来自 version-branch
),也会发生同样的事情。
您的历史记录可能如下所示:
*--*--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
。
如果你在变基期间遇到任何合并冲突(或者如果 version-branch
在 feature-branch
之后或之后从 master
分支出来并且你仍然遇到冲突),那么你将有处理它们,因为这意味着冲突发生在 feature-branch
中的提交和 version-branch
.
中的提交之间
您将在版本分支中遇到合并冲突,因为功能分支基于主分支,而(较旧的)版本分支具有不同的历史记录(精心挑选的提交、合并等)。
在您当前的功能分支中,如果它基于 master,将会有来自其他未合并功能的额外提交。所以我预计这将是一项艰巨的冲突解决工作。
我认为你甚至不能变基。如果您将版本分支重新定位到功能分支的基础,那么您的版本分支的精选合并和旧的已解决冲突将再次应用并导致新的冲突。
所以在我看来你的过程是错误的。如果你想将新功能应用到旧版本,那么功能分支必须基于最旧的版本分支。否则,您可能会更改新功能中的代码,而这些代码从来都不是旧版本的一部分,因为它仅被合并到 master。
我建议为版本(分支)创建不同的存储库,而不是使用分支进行版本控制。它使维护更容易。
要将该功能应用于不同的版本,请在完成实施后将其推送到功能分支中的目标版本存储库。然后您可以对代码进行必要的更改,解决冲突等,并将其合并到您的版本库的主目录中。
希望对您有所帮助。
我们对特征使用分支,然后将其合并到 master
。我们还为版本使用分支。但是,我有一个特殊功能(合并到 master
)需要进入版本分支。以前,我一直在为此使用 cherry-pick
(一次手动提取一个提交),但此功能的提交太多,无法一次完成一个。有没有更好的方法?
此功能已合并到 master
。该分支在本地不再存在。但是,我确实有将其合并到 master
.
我能够恢复 feature-branch
(因为我们使用 GitHub)。但是,在版本分支中,当我 运行 git merge feature-branch
时,我得到了与该功能无关的各种冲突。如果我做 git rebase feature-branch
(来自 version-branch
),也会发生同样的事情。
您的历史记录可能如下所示:
*--*--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
。
如果你在变基期间遇到任何合并冲突(或者如果 version-branch
在 feature-branch
之后或之后从 master
分支出来并且你仍然遇到冲突),那么你将有处理它们,因为这意味着冲突发生在 feature-branch
中的提交和 version-branch
.
您将在版本分支中遇到合并冲突,因为功能分支基于主分支,而(较旧的)版本分支具有不同的历史记录(精心挑选的提交、合并等)。 在您当前的功能分支中,如果它基于 master,将会有来自其他未合并功能的额外提交。所以我预计这将是一项艰巨的冲突解决工作。
我认为你甚至不能变基。如果您将版本分支重新定位到功能分支的基础,那么您的版本分支的精选合并和旧的已解决冲突将再次应用并导致新的冲突。
所以在我看来你的过程是错误的。如果你想将新功能应用到旧版本,那么功能分支必须基于最旧的版本分支。否则,您可能会更改新功能中的代码,而这些代码从来都不是旧版本的一部分,因为它仅被合并到 master。
我建议为版本(分支)创建不同的存储库,而不是使用分支进行版本控制。它使维护更容易。 要将该功能应用于不同的版本,请在完成实施后将其推送到功能分支中的目标版本存储库。然后您可以对代码进行必要的更改,解决冲突等,并将其合并到您的版本库的主目录中。
希望对您有所帮助。