繁体   English   中英

GIT:从特定提交开始,还原所选的提交,释放,然后重新应用它们

[英]GIT: revert selected commits since a certain commit, release, then reapply them

对于XY的两个错误修正,有大量提交提交,这些修正已推送到远程存储库中的发行分支。 在提交a之后,完成了分支的最后一个稳定版本。

在此处输入图片说明 错误修正X已完成,但错误修正Y仍在进行中。 x提交与y提交混在一起。

初衷是为了释放错误修正XY在一起,但事情发生了变化,它的决定,我们现在需要释放X的修补程序。

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

我想到的一个解决方案是,从commit a分支,然后选择x1x2x3到新分支,然后从那里释放。 但是,不幸的是,这是不可能的,因为我必须从该分支中​​释放出来,然后再继续处理它(不要问我为什么,我只是这样做:))

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

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

最优雅的方法是重新设置--interactive

更新由于您已经澄清了甚至不是一个选择,因此显然您已经revert并左cherry-pick (就像会计师一样:没有删除,但有“柜台预订”)。

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

更新我已经在Coliru上制作了完整的独立演示Live

如果您可以“ 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

然后放开那个 它仍将来自当前分支,该分支已经具有两个y1y2提交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM