GIT:从某个提交,释放后重新应用所选提交,然后重新应用它们

时间:2013-09-12 22:37:00

标签: git release-management

两个错误修正 X Y 推送到一个发布分支的提交量很大远程存储库。分支的最后一个稳定版本是在提交 a 之后完成的。

enter image description here 修正了 X 错误,但错误修正 Y 仍在进行中。 x 提交与 y 提交相混淆。

最初的目的是一起发布错误修正 X Y ,但事情已经发生了变化并且已经确定我们需要立即发布 X 的修复程序

从概念上讲,这意味着我必须删除所有 y 提交并保留所有 x 提交提交 a - 然后从分支发布错误修复 X - 然后重新应用所有 y 再次提交,因此可以在错误修正 Y 上继续工作。

我想到的一个解决方案是从提交 a 分支,并选择 x1 x2 x3 到新分支,然后从那里发布。但是,不幸的是,这是不可能的,因为我必须从该分支发布并继续处理它(不要问我为什么,我只是这样做:))

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

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

1 个答案:

答案 0 :(得分:1)

最优雅的方式是改变 - 交互式

更新由于您澄清了甚至不是一个选项,显然您还剩revertcherry-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

并发布 。它仍然来自当前分支,它已经有两个y1y2提交。