【问题标题】:Melting together merge commits将合并提交融合在一起
【发布时间】:2013-10-05 22:07:20
【问题描述】:

这个问题和git rebase interactive: squash merge commits together很相关。

假设您正在为某个项目编写新功能。你从某个分支开始,比如devel,然后为你的功能构建一个分支,feature/X。有时你也会发现项目中的一些问题,所以你决定建立第二个分支,称为fixes,从devel开始。

由于您需要在feature/X 进行时应用修复,因此您会不时地继续使用git merge fixes,因此您最终会遇到以下情况:

      a --- b --- M --- c --- M --- d ---- e --- M (feature)
     /           /           /                  /
    /           /           /                  /
devel ----- fix1 ------ fix2 ------------- fix3 (fixes)

由于这从未被推送(所以我不会破坏其他人的历史),我想将所有合并分解为一个,得到以下结果:

      a ---------------------- M --- b --- c --- d --- e (feature)
     /                        /
    /                        /
devel -- fix1 -- fix2 -- fix3 (fixes)

获得此结果的一种方法是

git co -b feature2 devel
git merge --no-ff fixes
git rebase featur2 feature

这实际上完成了工作,但迫使我创建另一个分支feature2,稍后将出现在合并的提交消息中。此外,当您在两个以上的分支上工作时,请尝试这样做!

有没有更优雅的方式来做到这一点?这似乎是一个值得一个方便的命令的操作,所以我假设有一些捷径。

感谢您的帮助

【问题讨论】:

    标签: git merge feature-branch


    【解决方案1】:

    您可能想要使用git rebase --interactive--preserve-merges 选项,重新排序提交以便首先合并,然后将所有合并压缩在一起。如果我是你,我会做两次 rebase,一次重新排序,一次压缩,这样解决冲突会更简单。

    但是,你使用'feature2'的解决方案似乎已经足够好了,你可以编辑合并提交消息,所以'feature2'这个名字是没有问题的,而且你不需要创建一个分支,你可以工作在一个超然的头上:

    git checkout devel^0
    git merge --no-ff --edit fixes
    git rebase HEAD feature
    

    【讨论】:

    • 我想念devel^0 语法。那不应该只是devel 本身吗?
    • 如果你使用devel,你将在那个分支上,如果你使用devel^0,你不会,相反,你将在一个分离的HEAD上。如果您在devel,那么您将合并到该分支,但如果您在分离的 HEAD 中,您将合并到任何分支。
    【解决方案2】:

    如果你能忍受稍微不同的历史,即

     + --- a' --- b' --- c' --- d' --- e' (特征)
                                  /
                                 /
    开发——修复1——修复2——修复3(修复)

    然后你可以在一个命令中完成。

    $ git rebase 修复功能

    fixes 中已经存在该谱系时,您的历史是否有什么特别之处使您想要保留父链接与feature 上的合并提交无关?

    【讨论】:

    • 从源码来看确实是一回事。只是我喜欢对历史发展有一个清晰的认识。无论如何,您的解决方案可以完成工作,所以 +1。
    猜你喜欢
    • 2010-12-16
    • 2015-08-06
    • 2023-01-12
    • 1970-01-01
    • 2013-10-11
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多