修改使用合并来使用回扣的git主题分支的历史记录
我们的git开发工作流程是,主题分支不断地在最新的主文档上重新设置,直到它们被合并 然而,一个新的开发人员创建了主题分支,他在其中多次将master合并到他的主题分支中,以使它们保持最新修改使用合并来使用回扣的git主题分支的历史记录,git,git-merge,git-rebase,Git,Git Merge,Git Rebase,我们的git开发工作流程是,主题分支不断地在最新的主文档上重新设置,直到它们被合并 然而,一个新的开发人员创建了主题分支,他在其中多次将master合并到他的主题分支中,以使它们保持最新 A---B---C---D---E topic / / / F---G---H---I master 虽然将这个主题分支合并到master是完全正确的,但它会导致非常混乱的历史。我想将这些主题分支转换为一个干净的线性重基历史记录,该历史记录可以通过一个--no ff合并提交干
A---B---C---D---E topic
/ / /
F---G---H---I master
虽然将这个主题分支合并到master是完全正确的,但它会导致非常混乱的历史。我想将这些主题分支转换为一个干净的线性重基历史记录,该历史记录可以通过一个--no ff
合并提交干净地合并到主历史记录中,即:
A'---B'---E' topic
/
F---G---H---I master
理想情况下,会有一些git-fu允许我执行重基,使主题分支上的提交保持原样,同时自动应用主题合并提交(如C和D)中已有的合并冲突解决信息
我知道我可以简单地应用“git diff master..topic”补丁,然后使用rebase向后工作,并手动将单个补丁拆分为单个提交,但是有更简单、更优雅的方法吗
我尝试了直接的
git-rebase
和git-rebase-p
命令,但运气不好。我发现下面的过程似乎工作得相当好,但并不完美。可能需要一些较小的冲突解决方案——见下文
git checkout topic
git merge master
git log --no-merges
--preserve merges
/-p
选项),解决任何冲突
git checkout master
git rebase --onto HEAD F topic
我发现在重定基址期间,冲突通常会导致文件处于冲突的“均已修改”状态,但它不包含冲突标记,因此简单的git add
和git rebase--continue
就足以解决冲突并继续。我相信git使用了之前的解决方案来解决冲突
git checkout master
git rebase --onto HEAD F topic
此外,在一些更复杂的分支中,将需要多个git-rebase--on-HEAD…
命令,或者可以使用git-cherry-pick
来选择单个提交。只需完成步骤2中给出的日志,将范围重定到HEAD和/或根据需要选择个人提交git diff topic..HEAD
git checkout -b rebased-topic
Raman的回答对我来说非常有用,但我想我应该在第4步中添加更多细节,这对我来说很棘手 我有一份更复杂的回购协议,就像这样
Q-R-S-T-U-V-W-X
/ / / /
A-B-C-D-E-F-G-H-I-J-K
我想要这个:
Q'-R'-S'-T'-U'-V'-W'-X'
/
A-B-C-D-E-F-G-H-I-J-K
有效的方法是将git-rebase——放在头qr
上,然后git-rebase——放在头su
上,这样基本上就可以获取我将master
合并到主题
中的位置之间的提交范围。在我做这件事的整个过程中,我处于超然的头部状态,所以如果你看到了,不要担心。有几次我有合并冲突,但它们都是我期望看到的合法冲突
最后,我得到了一个看起来正确的分支(Raman回答中的第6步),但出于某种原因,我不得不再次重新设置到master上,以实际移动提交。我不知道为什么我要这么做,但事情进展顺利
我认为这样做基本上等同于采摘樱桃,所以这样做可能更简单。Hmm,你确定这是你真正想要的吗?S、 图形中的V和X被视为合并提交,因此在所需状态下不应显示为S',V',和X'。除非它们包含了一系列手动解决冲突的方法。