两个错误修正 X 和 Y 推送到一个发布分支的提交量很大远程存储库。分支的最后一个稳定版本是在提交 a 之后完成的。
修正了 X 错误,但错误修正 Y 仍在进行中。 x 提交与 y 提交相混淆。
最初的目的是一起发布错误修正 X 和 Y ,但事情已经发生了变化并且已经确定我们需要立即发布 X 的修复程序。
从概念上讲,这意味着我必须删除所有 y 提交并保留所有 x 提交提交 a - 然后从分支发布错误修复 X - 然后重新应用所有 y 再次提交,因此可以在错误修正 Y 上继续工作。
我想到的一个解决方案是从提交 a 分支,并选择 x1 , x2 , x3 到新分支,然后从那里发布。但是,不幸的是,这是不可能的,因为我必须从该分支发布并继续处理它(不要问我为什么,我只是这样做:))
这不是我之前遇到的GIT问题,所以我不确定解决它的潜在模式。那么,实现目标的最优雅方式是什么?
我想要一个使用最少步骤的解决方案,在应用之前保留分支的真实历史记录(即我严格地不能重新命名!),并且不需要手动编辑文件,可能合并例外。
答案 0 :(得分:1)
最优雅的方式是改变 - 交互式
更新由于您澄清了此甚至不是一个选项,显然您还剩revert
和cherry-pick
(如会计师:没有删除,但“反预订”。
这可能会变得单调乏味。但是,您可以使用UI来获得优势。或者你可以自动化:
更新我做了一个完整的自包含演示 Live on Coliru
如果您可以'grep'发布跟踪器ID的提交,您可以自动执行任务。这是一个假设您在提交消息中使用票号#724
的演示。 (注意它是如何通过执行a..HEAD
来限制grep的提交范围(用相关的commit-id或标记替换a
):
$ 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
之前的最后一次提交。)
原始答案:
最优雅的方式是改变 - 交互式
git rebase -i a
许多git gui工具使得它非常容易(在Windows上使用TortoiseGit,非常好)。但是,我可以顺便按照命令行版本的屏幕上的说明操作(让你在文本编辑器中编辑rebase-plan')。
所以你的反叛就会出现例如。
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的工作者)。公正的警告。
完成了!
在rebase之后,只需标记新版本x3
(带有“comment5”),例如
git tag release_20130912 HEAD~2
并发布 。它仍然来自当前分支,它已经有两个y1
,y2
提交。