最优雅的方法是变基 --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
提交。