【问题标题】:Amalgamate two merges in Git在 Git 中合并两个合并
【发布时间】:2014-06-02 14:38:11
【问题描述】:

我有一个 Git 分支,它是一个 topic 分支,它显示了项目 master。我将它与主人合并并手动解决了冲突。之后,master 中修复了一个严重错误,我再次合并,这次没有冲突。我自己没有在两次合并之间提交任何东西,也没有将分支推送给其他任何人。我想合并这两个合并。

我现在拥有的是:

master ----A---B-----C---------->
                \     \
topic   ---W-----X-----Y-------->

地点:

  • X 是修复了冲突的合并
  • C 是 master 上的关键错误修复
  • Y 是包含此修复的合并

我想把它变成:

master  ----A---B---C----------->
                     \
topic   ----W---------X'-------->

X' 现在是一个合并,将冲突解决和错误修复合并到一个合并提交中。

我知道我可以通过检查 W 并合并 master 并在不可避免的冲突期间从 X 复制已解析文件的内容来手动完成。有没有更快的方法,更容易搞砸(在冲突很大且丑陋的情况下)?

【问题讨论】:

    标签: git version-control merge rebase


    【解决方案1】:

    如果您至少在W 之后真的没有推动任何事情,那么这可能是完成它的最简单方法(除了实际解决冲突 - 我猜这可能会很痛苦):

    git checkout topic
    git reset --hard W
    git merge master
    

    如果你从W 开始推送,但是(特别是如果XY 存在于你的存储库之外的任何地方),我不确定是否有一个干净的解决方案 - 无论你做什么,您将导致任何其他包含 XY 的存储库出现问题。

    当然,您必须重新解决冲突,除非您启用了rerere

    【讨论】:

    • 有了rerere,这正是我想要的。
    【解决方案2】:

    更快?

    git checkout topic
    git rebase -i W
    

    然后您可以压缩最后两个提交。

    git merge -ours master
    

    (再次记录mastertopic 之间的合并,无需“重做”合并)

    您也可以尝试使用-p (--preserve-merge) 选项,以保留主目录和主题之间的合并链接

    git rebase -p -i W
    

    【讨论】:

      【解决方案3】:

      很确定你可以在这里做git rebase origin/master..

      还有一点是分店很便宜。为什么不创建一个单独的克隆你的topictopic' 然后操纵他,最后你可以在它和topic 之间做一个差异来表明你没有改变任何东西(只有提交历史已经改变)

      【讨论】:

      • 是的,这是一种方法,但是您必须手动重新解决所有冲突。
      猜你喜欢
      • 2017-06-08
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多