【问题标题】:Git Merge and unset reverted commitsGit 合并和未设置的还原提交
【发布时间】:2017-03-24 05:28:18
【问题描述】:

我有一个开发分支,其中包含功能 1、功能 2 和一些修复。出于另一个开发原因,我们想从开发创建另一个分支,并且只想要该分支中的修复,没有功能 1 和功能 2。所以我从开发创建一个分支并恢复功能 1 和 2 的提交。现在我们在那个新分支上做了一些开发。现在我想将此分支与开发分支合并。但是我们需要开发分支中的特性 1 和 2。但是如果我们合并,那么功能 1 和 2 的提交将从开发中删除。

那么在 git 中解决它的最佳方法是什么。一种方法是获取功能 1 和 2 的更改,并将其作为补丁应用到合并的开发分支。但问题是这两个功能有几个变化。

【问题讨论】:

    标签: git


    【解决方案1】:

    在下面的答案中,我假设当您从 develop 分支时,您所做的第一件事是还原两个功能提交,然后您进行实际的开发工作。如果不是这种情况,我的回答应该仍然有帮助,尽管您可能需要执行一些额外的步骤来解决您的情况。

    也许概念上最简单的问题解决方案是从新分支中挑选非还原提交到develop

    git checkout develop
    git cherry-pick B^..D
    

    BD 替换为您要从新分支引入develop 的提交的SHA-1 提交哈希。请注意,您可能会因此遇到合并冲突,因为您正在将您的工作重新应用到不同的基础上。

    如果您喜欢冒险,也可以尝试使用git rebase --onto。这是一个图表,说明了您的新分支的当前状态和develop

    develop   ... ---A---B---C
                      \
    newbranch          R1---R2---D---E
    

    并且您想在develop 之上播放来自newbranchDE 提交,而忽略那些R1R2 还原提交。换句话说,你想要这样结束:

    develop   ... ---A---B---C---D'---E'
                      \
    newbranch          R1---R2---D---E
    

    您可以使用以下命令来实现:

    git checkout develop
    git rebase --onto C R2 E
    

    onto 命令表示以C 为基础,并重播所有父级为R2(但不包括R2 本身)的提交,直至并包括提交E。由于CdevelopHEAD 重合,我们只是要求Git 重播DE 的提交,按照develop 顶端的顺序。

    如果你想对 Git 的rebase --onto 有一个很好的解释,我建议在这里阅读@Enrico 给出的答案:

    I can't understand the behaviour of git rebase --onto

    【讨论】:

      猜你喜欢
      • 2011-12-19
      • 1970-01-01
      • 2012-12-29
      • 2012-06-06
      • 1970-01-01
      • 2021-06-14
      • 2016-11-01
      • 1970-01-01
      • 2017-07-06
      相关资源
      最近更新 更多