撤销合并 Git-Flow

6
我正在使用 SourceTree 和 Git-Flow 模式。现在,我为我的 beta 测试人员准备了一个发布版本进行测试,因此我创建了一个名为 release/v1.0.1 的新分支。但是,我的注意力不够集中,我决定完成(合并到 developmaster 并打标签)发布,即使我甚至还没有将发布发送给我的测试人员。因此,如果我的测试人员发现任何错误,我希望能再次打开发布分支,以便我可以在发布分支中修复这些错误,然后当所有错误都被修复时,我才能完成发布。
那么,如何轻松使用 SourceTree(或使用 git 命令)将代码回滚到创建 release/v1.0.1 分支时的状态?
附上 SourceTree 的截图: enter image description here 编辑:好的,我在 develop 上执行了 git reset --hard HEAD~2(HEAD~2),因为我已经手动检查过了。但是现在,当我切换到 master 并执行 git reflog 时,看起来我应该在 HEAD~6 上重置。
Peters-MacBook-Pro:Remessage peterwarbo$ git reflog
f7663b1 HEAD@{0}: checkout: moving from develop to master
3d132da HEAD@{1}: reset: moving to HEAD~2
2f1c753 HEAD@{2}: checkout: moving from master to develop
f7663b1 HEAD@{3}: checkout: moving from develop to master
2f1c753 HEAD@{4}: merge release/v1.0.1: Merge made by the 'recursive' strategy.
4332fe4 HEAD@{5}: checkout: moving from master to develop
f7663b1 HEAD@{6}: merge release/v1.0.1: Merge made by the 'recursive' strategy.
fe323ef HEAD@{7}: checkout: moving from release/v1.0.1 to master
28a63ea HEAD@{8}: commit: Bumped version number to 1.0.1

但是当我这样做时,会出现以下“错误”:
Peters-MacBook-Pro:Project peterwarbo$ git reset --hard HEAD~6
fatal: ambiguous argument 'HEAD~6': unknown revision or path not in the working tree.

编辑2: 新图片以说明疏忽。

enter image description here

编辑3: 附加新图片以说明在使用user1615903的答案中发出git命令后的当前状态。为什么显示develop滞后2个版本?即使我将其重置到初始提交(fe323ef),为什么还会有合并自release/v1.0.1到master的情况?

enter image description here


所以基本上你只需要在主分支和开发分支中删除最后一次提交,然后再将28a63ea设置为“release/v1.0.1”即可? - 1615903
我认为是这样的吗?我还需要撤销对masterdevelop进行的合并。 - Peter Warbo
标签也应该被删除。基本上,我只想回到我创建release/v1.0.1分支并进行提交以提高版本号的状态。 - Peter Warbo
3
HEAD~6(从 HEAD 往前数 6 次提交)与 HEAD@{6}(往回数 6 次 git 操作)不同。 - Gareth
1个回答

16
这非常简单。你需要执行以下操作:
  • 将develop分支重置到合并之前的提交

  • 将master分支重置到合并之前的提交

  • 使发行分支再次指向正确的提交

  • 移除标签

  • 将修复后的提交推送到远程仓库

因此,要执行步骤1和2:
git checkout develop
git reset --hard 4332fe4

git checkout master
git reset --hard <SHA of the commit the master was before the merge>

然后要“重新创建”发布分支:

git checkout -b "release/v1.0.1" 28a63ea

最后,删除标签:

git tag -d v1.0.1

关于撤销 Git 合并的更多信息,可以查看此 Stack Overflow 问题

若变更已经被推送,则需要使用 -f 开关来覆盖远程中的变更:

git push -f

从远程删除标签的方法如下:
git push --delete origin v1.0.1

我试过了您推荐的方法,但现在好像卡住了?请看我的更新问题。 - Peter Warbo
所以,你用HEAD~2重置了吗?这意味着你将分支头向后移动了两个提交,并且现在你正在尝试将其向后移动6个提交?请在SourceTree中包含一张新图片,这真的有助于说明问题。 - 1615903
那我搞砸了?我能撤销吗?(幸运的是,我的代码库在Bitbucket上有备份)我现在正在上传新图片。 - Peter Warbo
我编辑了我的回答,使其引用提交 SHA 而不是 HEAD-something。别担心,在 git 中永久删除东西真的很困难。 - 1615903
1
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/28438/discussion-between-user1615903-and-peter-warbo - 1615903

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接