如何在Git存储库中合并两个并行分支?

如何在Git存储库中合并两个并行分支?,git,gitlab,git-merge,Git,Gitlab,Git Merge,我有一个项目没有Git存储库,所以我在Gitlab中为它创建了一个。在创建repo时,我有两个文件夹,一个包含生产代码,另一个包含开发代码 我在包含生产代码的文件夹中创建了一个本地gitrepo。我将代码推送到我最初创建的存储库的远程主 然后,我在包含开发代码的文件夹中创建了一个本地gitrepo。我从本地主节点创建了一个新的本地分支(比如xyz)。我将这个新的本地分支xyz推送到同一个远程存储库 远程存储库现在有master分支和xyz分支。现在,当我完成开发时,我想将xyz分支合并到mast

我有一个项目没有
Git
存储库,所以我在
Gitlab
中为它创建了一个。在创建repo时,我有两个文件夹,一个包含生产代码,另一个包含开发代码

我在包含生产代码的文件夹中创建了一个本地
git
repo。我将代码推送到我最初创建的存储库的远程

然后,我在包含开发代码的文件夹中创建了一个本地
git
repo。我从本地主节点创建了一个新的本地分支(比如xyz)。我将这个新的本地分支
xyz
推送到同一个远程存储库

远程存储库现在有
master
分支和
xyz
分支。现在,当我完成开发时,我想将
xyz
分支合并到
master


但是,当我试图做得过火时,我在同一个存储库中有两个并行分支,它们具有不相关的历史记录。一个解决方案可能是删除存储库,重新开始使用我刚完成的新代码,但有没有办法保留旧代码并合并这些分支?

如果我理解正确,您在master中有一个单一版本(或者可能是多个版本,没关系)和上一个生产环境。。。。然后你有一个与母版平行的分支,从第一次修订开始就是母版的延续。是这样吗?因此,如果我们能够将xyz的第一个(最早的)版本(该版本的内容)放在master之上,然后在xyz的第一个版本之后重播所有其他版本,您会很高兴吧

好的。。。如果是这样的话:

git checkout first-revision-xyz # check out the first revision of xyz
git reset --soft master # set the branch pointer on top of the current position of master (master won't be touched, don't worry)
git commit -m "taking back content to how it is on the first revision of xyz" # create a new revision, set appropriate comment
git cherry-pick first-revision-of-xyz..xyz # replay all the other revisions up to the last revision of xyz
# if you like the result
git checkout -b development
在这里您创建了分支开发,它遵循master,然后您可以像往常一样开始使用它

作为一种不同的策略,您可能希望合并两个分支,但保持树(文件和内容)在xyz上的状态?这可以在不经过真正合并过程的情况下完成

git checkout -b test $( git commit-tree -p master -p xyz -m "Merge of prod an development" ${xyz^tree} )

Created a test branch that has the merge of both branches keeping the tree as it is on xyz.

我建议您看看
git-rebase
。如果我以后有时间,我会写一个更详细的答案。是的,你理解得对。我现在需要试试你的解决方案。1年多之后,我注意到配方中有一点不正确,尽管总体概念是正确的。我调整了食谱