首页 > 解决方案 > git undo 合并到 master,但将更改保留在本地

问题描述

我有一个功能分支和一个主分支。我对该功能做了一些工作,合并到 master 中,推送更改,然后远程和本地删除了功能分支。到目前为止,一切都很好。

合并后,我意识到我的功能更改存在问题。我想撤消 master 上的合并,但仍保留功能更改,以便我可以再次处理它们。我怎样才能做到这一点?

我原本拥有的:

A---B---C---D   [master]
     \      
      E----F    [feature]

我现在拥有的:

A---B---C---D---EF (squashed) [master]

我想要的是:

A---B---C---D      [master]
             \
              EF   [feature]

我该如何做到这一点?

标签: git

解决方案


有许多命令序列可以做到这一点。这是一个简短的。

  1. 确保所有内容都已提交 ( git status),以便第 3 步不会破坏任何内容。这始终是一个有用的基本步骤。:-)
  2. 运行git branch feature
  3. 运行git reset --hard HEAD^git reset --hard HEAD~(拼写都可以,使用您喜欢输入的任何内容)。

解释:

  • 第 1 步应该很明显。

  • 第 2 步创建新名称feature,标识与标识相同的压缩EF提交master。这给了你:

    A--B--C--D--EF   <-- master (HEAD), feature
    

    注释显示(HEAD)哪个分支名称是当前分支名称,因此哪个提交也是当前提交(在这种情况下EF)。

  • 第 3 步移动当前分支名称以指向选定的提交。正如我们在图中看到的那样,当前的分支名称是master. 选定的提交是从提交返回的一个第一父级EFEF^表示“提交的第一个父级EF”并且EF~意味着“从 开始EF,后退一个第一个父级”。

    结果是:

    A--B--C--D   <-- master (HEAD)
              \
               EF   <-- feature
    

    这就是你想要的。

请注意,EF~2这将从 at 开始EF并倒数两次,D然后到C,因此master(still HEAD) 将指向 commitC而不是 commit D--hardtogit reset告诉 Git 用所选提交中的内容替换索引内容,并更新您的工作树以匹配。


推荐阅读