GIT合并只是一系列提交

GIT合并只是一系列提交,git,branch,git-merge,git-rebase,git-cherry-pick,Git,Branch,Git Merge,Git Rebase,Git Cherry Pick,我想从一系列提交中接管更改 情况如下。我有大师和我的特征分支。我修复了一个bug(将a提交到e),并将此修复提交给了主机。但是有一个发布分支也应该成为这个bug修复程序。这个发布分支几个月前从master分支出来,只针对主要bug获取新内容 通常,我会手动将更改转移到发布分支中。 是否有一种技术可以将特性分支中的更改与bug修复合并到发布分支中,而不使用m1 在我看来,由于提交r1和m1之间的提交,合并是不可能的。但是有人知道如何处理这种情况吗 根据提交r1到m1引入的更改,如果这些更改干扰了功

我想从一系列提交中接管更改

情况如下。我有大师和我的特征分支。我修复了一个bug(将a提交到e),并将此修复提交给了主机。但是有一个发布分支也应该成为这个bug修复程序。这个发布分支几个月前从master分支出来,只针对主要bug获取新内容

通常,我会手动将更改转移到发布分支中。
是否有一种技术可以将特性分支中的更改与bug修复合并到发布分支中,而不使用m1

在我看来,由于提交r1和m1之间的提交,合并是不可能的。但是有人知道如何处理这种情况吗


根据提交r1到m1引入的更改,如果这些更改干扰了功能分支,您可以尝试将功能分支重设到发布分支上:

git rebase --onto release-branch m1 feature-branch
如果它们不相互干扰,那么重定基础应该很简单,您可以简单地将重定基础的功能分支合并到发布分支中。
有关详细信息:

您可以选择一个范围。开始索引是所需提交的父级

git checkout release
git cherry-pick a^..e
有(至少)两种方法可以做到这一点

我认为大多数人会推荐的方式是git cherry pick;您可以列出要将其更改应用于发布分支[1]的特定提交。您可以在此处找到文档:

我推荐的方法是使用
rebase
。您可以做一个交互式的重新基址,可能很简单

git checkout --detach master
git rebase -i <release_branch>
git branch -f <release_branch>
git签出——分离主控
git-rebase-i
吉特分行-f
这将调出一个“待办事项列表”,您可以对其进行编辑以满足您的需要。在这种情况下,您可以找到表示要更改的提交的行,然后从待办事项列表中删除所有其他内容

文件:

重要信息-请注意,重基是在分离的头状态下完成的,以避免将任何引用作为重基的一部分进行移动;完成后,您必须更新发布分支,使其包含新复制的提交。这些是使用重基进行此操作的“成本”——尽管根据首选项,有多种方法可以实现此操作但我个人觉得这样做比cherry pick(这需要我先找出表达式来识别提交)更方便用户(所以git提供了我可以搜索和编辑的待办事项列表)

这些方法在大多数方面都是等效的。需要注意以下几点:

这些命令将原始提交“复制”到新位置。这里的“复制”一词有点误导性-每次提交都会计算一个补丁,表示该提交引入的更改;这些补丁将应用于新的基础,以创建新的提交

在某些方面,这类似于手动应用更改。特别是,git不会“记住”新提交与原始提交相关,因此,如果出于某种原因,您以后想要在
master
和发布分支之间进行合并,则可能会发生冲突,就像您以前手动应用的更改可能会导致冲突一样

但在其他方面,这就像进行一种奇怪的合并,这意味着cherry pick或rebase操作本身可能会产生冲突(这些冲突并不总是最直观的,尽管大多数情况下,只要您考虑命令试图完成的任务,它们并不太糟糕)



[1] -您可以通过其SHA ID或与某些ref相关的表达式(如
master~2
表示“masters第一父级的第一父级”)来识别单个提交。您可以指定提交的范围,如
master~6..~master~2
,尽管cherry pick在范围方面有点滑稽。如果您遵循这些文档,它们将带您经历许多不同的变化

什么是
m1
?你能包括一个分支图吗?