git - 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 status
),以便第 3 步不会破坏任何内容。这始终是一个有用的基本步骤。:-) - 运行
git branch feature
。 - 运行
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
. 选定的提交是从提交返回的一个第一父级EF
:EF^
表示“提交的第一个父级EF
”并且EF~
意味着“从 开始EF
,后退一个第一个父级”。结果是:
A--B--C--D <-- master (HEAD) \ EF <-- feature
这就是你想要的。
请注意,EF~2
这将从 at 开始EF
并倒数两次,D
然后到C
,因此master
(still HEAD
) 将指向 commitC
而不是 commit D
。--hard
togit reset
告诉 Git 用所选提交中的内容替换索引内容,并更新您的工作树以匹配。
推荐阅读
- pip - Python:安装最新版本后没有 Pip
- xml - XSLT 文档功能在 chrome 中不起作用
- raspberry-pi - 如何在 openwrt 中收集系统日志?
- wordpress - Wordpress 问题 - Google 字体呈现方式不同
- python - PyQt5 多线程仍然冻结。如何提高性能?
- c++ - C++矩阵数学新手查询
- .net - 在 Windows 服务应用程序中使用 MediatR 和 CQRS
- r - How to export/read an empty dataframe in R?
- angular - Angular 和 html5 日期无效输入问题
- elasticsearch - Kibana Dashboard only 模式