【问题标题】:Merge changes from branch into different branch without merging the branch将分支中的更改合并到不同的分支而不合并分支
【发布时间】:2015-10-02 12:45:24
【问题描述】:

我有一个流程,我将在单独的“开发”分支上工作,然后在完成后将它们合并到“稳定”主分支中。然后,我将为从 master 创建的下一个开发分支创建一个新分支。这确保了每个开发分支始终包含最新的稳定更改。但我犯了一个错误。我忘记将开发分支合并到 master 中,但后来我从 master 创建了一个新分支并做了很多工作。所以这个有很多变化的新分支并没有跟上最新的稳定变化。

我继续将之前的开发分支合并到 master - 我忘记合并的那个。现在我需要将 master 的更改合并到我最新的开发分支中。但我实际上并不想将 master 分支合并到 dev 分支中,从而带来它的所有历史记录。我希望这些分支保持独立,我只想比较两个分支之间的差异并将适当的代码从 master 合并到 dev 分支中作为一个新的提交。我知道会有冲突。怎么实现?

如果可能的话,我更愿意使用 Xcode 的源代码控制直观地进行此操作,以比较和选择更改,但如果不使用终端也可以。

【问题讨论】:

    标签: xcode git merge


    【解决方案1】:

    如果我理解你的情况:

    • 您从 master 创建了一个功能分支。
    • 您将新工作合并到 master(“新”在此处用作与您创建功能分支时不同的工作)。
    • 您现在希望确保您的功能分支与 master 上的当前内容保持同步,但不想实际合并 master。

    在这种情况下你可以做的是rebase你的分支对抗master。

    # When on your feature branch:
    git rebase master
    

    这将确保您之前完成的工作出现在 master 上存在的任何新工作之后。它还会重写历史记录,因此如果您在任何时候推送了该功能分支,则必须强制推送它以确保维护正确的历史记录。

    澄清我的最后一点:当你变基时,你overwrite the history 的提交是通过创建一个与另一个相似但又不相同的提交(不同的祖先)。

    这里的主要指导原则是历史已更改,如果该历史已发布,您将需要确保发布具有重新定位更改的历史而不是,以便历史显示为应该关于 rebase 操作。

    【讨论】:

    • 这似乎是我的场景。我会注意到新的 dev 分支包含许多 master 没有的更改,包括对其的推送。我知道会有合并冲突。我不希望 dev 分支的历史被删除,当然也不希望 master 的历史被删除。如果您可以扩展您的最后一段,我将不胜感激。具体来说,我不确定您所说的强制保存历史是什么意思。
    • 你不会丢失历史,你只是改变它。也就是说,Git 将其识别为已经发生的新事物,但它是一个非常具体的提交,被重放以按照一定的祖先顺序出现。
    • 我继续使用变基。我解决了冲突,运行git rebase --continue,它将我的提交应用到开发分支,然后记录Revert "Merge branch 'master' into dev-branch"。在终端上看起来一切都很好,但看看代码并没有任何区别 - 来自 master 的更改没有合并到 dev-branch 中。没有未提交的更改。
    • 你没有提到任何关于恢复的事情。如果您还没有推送 rebase,请执行 git reset --hard origin/dev-branch,然后还原还原:git revert <SHA>
    • 我如何获得用于还原的 SHA,它在执行重置后不再显示在 git log
    【解决方案2】:

    您可能希望在合并时使用 --squah 修饰符。这将合并代码,但不会创建合并两个分支历史的提交。

    http://git-scm.com/docs/git-merge

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多