[英]GIT: revert selected commits since a certain commit, release, then reapply them
对于X和Y的两个错误修正,有大量提交提交,这些修正已推送到远程存储库中的发行分支。 在提交a之后,完成了分支的最后一个稳定版本。
错误修正X已完成,但错误修正Y仍在进行中。 x提交与y提交混在一起。
初衷是为了释放错误修正X和Y在一起,但事情发生了变化,它的决定,我们现在需要释放X的修补程序。
从概念上讲,这意味着我必须删除所有自提交a以来的y提交,并保留所有x提交-然后从分支中释放bugfix X-然后重新应用所有y提交,以便可以在bugfix Y上恢复工作。
我想到的一个解决方案是,从commit a分支,然后选择x1 , x2和x3到新分支,然后从那里释放。 但是,不幸的是,这是不可能的,因为我必须从该分支中释放出来,然后再继续处理它(不要问我为什么,我只是这样做:))
这不是我以前使用GIT遇到的问题,因此我不确定有哪些潜在的模式可以解决它。 那么, 实现目标的最优雅的方法是什么?
我想要一个使用最少步骤的解决方案,在应用分支之前保留分支的真实历史记录( 即,我严格不能变基! ),并且不需要手动文件编辑(合并可能除外)。
最优雅的方法是重新设置--interactive
更新由于您已经澄清了这甚至不是一个选择,因此显然您已经revert
并左cherry-pick
(就像会计师一样:没有删除,但有“柜台预订”)。
这可能会很乏味。 但是,您可以使用UI来发挥自己的优势。 或者您可以使事情自动化:
如果您可以“ grep”问题跟踪器ID的提交,则可以使事情自动化。 这是一个演示示例,假设您在提交消息中使用了票证编号#724
。 (请注意,它如何通过执行a..HEAD
(用相关的commit-id或标签代替a
来限制对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
提交。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.