1

有两个错误修正XY的大量提交被推送到远程存储库中的发布分支。分支的最后一个稳定版本是在提交.

在此处输入图像描述 修正X已完成,但修正Y仍在进行中。x提交与y提交混合在一起。

最初的意图是同时发布错误修复X​​和Y ,但事情发生了变化,我们决定现在需要发布X 的修复。

从概念上讲,这意味着我必须删除所有y提交并保留自提交a以来的所有x提交 - 然后从分支中释放 bugfix X - 然后再次重新应用所有y提交,以便可以在 bugfix Y上恢复工作。

我想到的一个解决方案是从提交a和cherry pick x1x2x3分支到新分支,然后从那里释放。然而,不幸的是这是不可能的,因为我必须从这个分支中释放并在之后继续工作(不要问我为什么,我只是这样做:))

这不是我以前在使用 GIT 时遇到过的问题,所以我不确定有哪些潜在的模式可以解决它。那么,实现我的目标的最优雅的方式是什么?

我想要一个使用最少步骤的解决方案,在应用之前保留分支的真实历史(即我严格不能变基!),并且不需要手动文件编辑,合并可能除外。

4

1 回答 1

1

最优雅的方法是变基 --interactive

更新既然你澄清甚至不是一个选择,很明显你已经revert离开cherry-pick了(就像一个会计师:没有删除,但是'反预订')。

这可能会变得乏味。但是,您可以使用 UI 来发挥自己的优势。或者你可以自动化一些事情:

更新我在 Coliru 上制作了一个完整的独立演示

如果您可以“grep”问题跟踪器 ID 的提交,则可以使事情自动化。这是一个演示,假设您#724在提交消息中使用了票号。a..HEAD(请注意它如何通过执行(替换a为相关的提交 ID 或标签)限制对 grep 的提交范围:

$ culprits=$(git rev-list --grep='#724' a..HEAD)
$ do git revert --no-edit $culprits

现在做你的释放!

$ git tag RELEASE_20130913   # or, maybe, do the release immediately
    $ git cherry-pick $culprits 

如果你搞砸了,只是git reset --hard 'commit'('commit' 指的是第一个之前的最后一个提交revert)。


原答案:

最优雅的方法是变基 --interactive

git rebase -i a

许多 git gui 工具使执行此操作变得异常容易(Windows 上的 TortoiseGit,非常好)。但是,按照命令行版本中的屏幕说明(让您在文本编辑器中“编辑变基计划”),我没有任何问题。

所以你的变基会想出例如

pick a comment1
pick x1 comment2
pick y1 comment3
pick x2 comment4
pick x3 comment5
pick y2 comment6

只需重新排序:

pick a comment1
pick x1 comment2
pick x2 comment4
pick x3 comment5
pick y1 comment3
pick y2 comment6

注意确实会在提交之后重写历史记录x1(但尚未发布,您可能可以决定这是否是您的同事的问题,他们现在可能不得不将他们的更改重新定位到较新的 HEAD 上)。只是公平的警告。

并做了!


在变基之后,只需标记新修订版x3(使用“comment5”),例如

git tag release_20130912 HEAD~2

并释放。它仍将来自当前分支,该分支也已经有两个y1,y2提交。

于 2013-09-12T22:50:54.980 回答