【问题标题】:Git, undo merge commit on rebaseGit,撤消变基上的合并提交
【发布时间】:2017-10-04 05:36:46
【问题描述】:

我的历史有点像下面

  * (TOPIC) topic 3
  |
| * merge master onto topic
|/|
* | master 3
| * topic 2
* | master 2
| | 
| * topic 1
|/
* master 1
|

即上游分支合并到主题一次。现在我想以交互方式重新设置这个主题分支在同一个基础上,但撤消合并(合并提交本身以及合并引入的来自 master 的所有提交)。这怎么可能?

【问题讨论】:

    标签: git merge rebase


    【解决方案1】:

    让我们为绘图中描述的提交使用有效标识符:

      * topic3          (TOPIC) topic 3
      |
    | * topic2merge     merge master onto topic
    |/|
    * | master3
    | * topic2
    * | master2
    | | 
    | * topic1
    |/
    * master1
    |
    

    如果你想删除合并提交(使topic2成为merge master onto topic之后第一个提交的唯一父级),你需要运行以下git rebase命令:

    git rebase --onto topic2 topic2merge topic3
    

    如果当前分支已经是topic3,你可以从上面的命令中省略topic3(如果它存在,git rebase 做的第一件事就是检查它,如果它不是当前分支) .

    经过此操作后,图形如下所示:

    | * topic3      <-- (TOPIC) topic 3
    | |
    * | master3
    | * topic2
    * | master2
    | | 
    | * topic1
    |/
    * master1
    |
    

    topic2mergetopic3 之间的提交仍然存在于存储库中,但它们不再可见。如果它们可以到达,它们仍然可见,并且如果有指向它们的分支就会发生这种情况。甚至是远程分支。

    如果您已经将topic3 推送到远程仓库,您必须运行git push -f origin topic3(将origin 替换为您的远程名称)并告知您的同事您已更改历史记录这一事实。他们需要知道这一点;在他们的存储库中topic3 在其历史记录中仍然有topic2merge,并且您所做的更改代表了他们的回购不会自动采用的替代历史记录线。他们必须使用git reset --hardgit rebasegit cherry-pick 来跟上。

    【讨论】:

      【解决方案2】:

      你可以使用命令

      git rebase -i --onto master1 master topic
      

      这将采用topic 中但不在master 中的所有非合并提交(主题1、主题2、主题3)并将它们应用到master1 提交之上。

      【讨论】:

        猜你喜欢
        • 2021-06-26
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 2013-06-10
        相关资源
        最近更新 更多