代码之家  ›  专栏  ›  技术社区  ›  Tuomas Toivonen

Git,在重新设置基础时撤消合并提交

  •  3
  • Tuomas Toivonen  · 技术社区  · 7 年前

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

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

    2 回复  |  直到 7 年前
        1
  •  8
  •   axiac    7 年前

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

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

    如果要删除合并提交(make topic2 之后第一次提交的唯一父级 merge master onto topic )您需要运行以下命令 git rebase 命令:

    git rebase --onto topic2 topic2merge topic3
    

    topic3 你已经可以省略了 主题3 从上面的命令(如果有,首先 git再基 如果它不是当前分支,则执行对它的签出)。

    执行此操作后,图形如下所示:

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

    和之间的提交,包括 topic2merge 主题3 仍存在于存储库中,但不再可见。如果它们是可访问的,则它们仍然可见,如果有指向它们的分支,则会发生这种情况。甚至是远程分支。

    您必须运行远程回购 git push -f origin topic3 (更换 origin 主题3 仍然有 主题2 merge 在其历史中,您所做的更改代表了他们回购不会自动采取的另一条历史线。他们必须使用 git reset --hard git再基 git cherry-pick 跟上。

        2
  •  5
  •   max630    7 年前

    您可以使用命令

    git rebase -i --onto master1 master topic
    

    这将接受所有在中的非合并提交 topic master (主题1、主题2、主题3)并将其应用于 master1 犯罪