在我们的Git工作流中,如何减少合并冗余(用于确保master是所有的根)?

在我们的Git工作流中,如何减少合并冗余(用于确保master是所有的根)?,git,merge,git-merge,cherry-pick,git-workflow,Git,Merge,Git Merge,Cherry Pick,Git Workflow,我们使用2个长寿命分支master/dev的“Git工作流”。我们相信我们需要2个长寿命分支,而不是1个,因为我们做企业(2B)业务。与我们的最新功能相比,我们的客户更喜欢稳定的产品 在每个版本(将dev合并到master中)之后,我们的测试团队将确定我们需要在下一个版本中修复的几个bug,然后在dev分支中修复它们。我们开发的新特性也被合并到开发分支中。bug修复分支和功能分支在合并到dev后将被删除 但突然,客户支持团队接到客户的愤怒电话,告诉我们需要一个特定的bug修复/功能,以便快速进入

我们使用2个长寿命分支master/dev的“Git工作流”。我们相信我们需要2个长寿命分支,而不是1个,因为我们做企业(2B)业务。与我们的最新功能相比,我们的客户更喜欢稳定的产品

在每个版本(将dev合并到master中)之后,我们的测试团队将确定我们需要在下一个版本中修复的几个bug,然后在dev分支中修复它们。我们开发的新特性也被合并到开发分支中。bug修复分支和功能分支在合并到dev后将被删除

但突然,客户支持团队接到客户的愤怒电话,告诉我们需要一个特定的bug修复/功能,以便快速进入产品。这种情况中断了我们的正常工作流程,并引出了我要问的问题

因为我们的客户需求的代码更改已经在dev分支中了,所以我们将想要的提交挑选到master中(尽管我们完全知道)。樱桃采摘似乎是这里唯一的选择

但是我们总是想确保主分支是所有其他分支的基础,之后我们总是从主分支合并到开发分支。合并通常不会在dev分支中引入代码更改,而只是向每个以master为根的人显示分支树

我知道我可以在master上重新设置dev分支的基础,以避免这种合并。但rebase也不理想,原因有很多(我没有在这里列出它们,以避免回避我的问题)

那么,有没有其他方法可以确保master是所有分支的根,并避免重复/空合并呢?

全脂(我敢说是规范的)方法可以非常痛苦地、有时甚至令人满意地跨分支正确应用提交

git checkout -b fixbug26535 $(git merge-base all active tips with the bug)
git cherry-pick the bug fix
git checkout where-the-fix-came-from
git merge -s ours bugfix26535
(因此,如果您有
master
dev1
dev2
,并且可以方便地在dev1提示处进行错误修复

git checkout -b fixbug26535 $(git merge-base master dev1 dev2)
git cherry-pick dev1
git checkout dev1
git merge -s ours bugfix26535
)

现在您已经有了一个很好的可合并错误修复分支,它不会对可能合并到的任何提示进行不必要的更改或创建不必要的冲突。您可以在空闲时将其合并到
master
dev2

但是因为我们总是想确保主分支是所有其他分支的基础,所以我们总是在那之后从主分支合并到开发分支

您可以在将bugfix合并到master之前或之后执行此操作,因为已经记录了其更改的正确祖先


若要在录制过程中挑拨离间,请将错误修复基于引入错误的提交,然后从上面合并到合并库,以便一次完成所有常见更新。结果历史的Ascii图将是混乱的,但结构将绝对记录所有发生的事情和原因。

我并不完全清楚您的确切工作流程,但我可以建议在
master
上创建热修复分支,在那里您可以修复bug,然后直接合并回
master
分支。不,这是我在问题中说的,我不能这么做。我无法创建bug修复分支并将其用作合并基础,因为我需要的代码已经在dev branch中。然后修复您的工作流,这样就不会发生这种情况。这是我的答案。但如何,这是我的问题。我相信代码主分支所需要的总是可能已经在“未来”分支中。您是否已经将功能分支合并到主分支中一次,现在您修复了功能中的一个bug,问题是如何将修补程序提交回master?我更新了我的问题,关于为什么我的问题首先发生,我觉得这很常见(至少我发现是这样),这就是这个答案所解决的问题,您需要从较长的分支中选择一个错误修复。我不熟悉您所说的内容,因此我需要首先调查它。谢谢顺便说一句,我更新我的问题的部分原因是因为我觉得这不是我唯一的问题,我也不明白为什么我的问题得到了封闭投票。我一直在考虑你的解决方案,我得出的结论是它不会起作用!git merge-s我们的bugfix26535将在开发中引入一个空提交。这就是我首先要解决的问题!此外,您的第一步git checkout-b fixbug26535$(git merge base all active tips with the bug)在我的案例中没有任何用处。因为我们已经努力使master成为所有分支的根(这导致了我的问题),所以结果将是一个分支只是复制master分支。