[英]git undo merge to master, but keep the changes locally
我有一个功能分支和一个主分支。 我对该功能做了一些工作,合并到 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
提交( git status
),以便第 3 步不会破坏任何内容。 这始终是一个有用的基本步骤。 :-)git branch feature
。git reset --hard HEAD^
或git reset --hard HEAD~
(拼写都可以,使用您喜欢输入的任何内容)。解释:
第 1 步应该是显而易见的。
第 2 步创建新名称feature
,标识与master
标识相同的压缩EF
提交。 这给你:
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
将从EF
开始并倒数两次,到D
然后到C
,这样master
(仍然是HEAD
)将指向提交C
而不是提交D
。 --hard
to git reset
告诉 Git 用所选提交中的内容替换索引内容,并更新您的工作树以匹配。
您需要在合并D
之前将 --sort master 分支重置为提交,这将使您掌握D
提交,并且EF
提交将在您的机器上本地,确保从这里然后强制推送主删除不需要的EF
提交然后创建新的feature
分支并再次提交本地更改
脚步:
git reset --soft YOUR_COMMIT_HASH
git status
// 确保你的文件没有消失
git stash
// 让你的脑袋干净
git push -f origin master
git checkout -b feature
git stash pop
// 检索已删除的提交更改
参考: https : //git-scm.com/docs/git-reset#Documentation/git-reset.txt---soft
这可以通过 3 个步骤完成:
在master
分支上:
$ git reset --hard <Hash of D> # D is now the tip of master branch
$ git switch -c feature # Creates a new feature branch based on D and move to it
现在在新创建的feature
分支上:
$ git cherry-pick <Hash of EF> # Restores the EF commit
这就是所需要的全部内容。
当一个分支被删除时,任何丢失的提交都可以在给定的时间段内(默认为 30 天)在reflog
找到,因此可以在那里找到EF
提交哈希以防万一:
$ git reflog
注意: git 2.23.0+
提供了switch -c
命令,其作用与checkout -b
相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.