Git工作流程-从发布分支撤销功能分支

10
我正在尝试理解创建git工作流的问题。
我们考虑使用功能分支同时开发多个功能,假设我们有:
- F1 (Feature 1)
- F2 (Feature 2)
- F3 (Feature 3)

我们刚刚完成了功能1和功能3,并将它们合并到我们的开发分支中进行集成测试:
-F1---Commit1---Commit2----------------------------------
-F2--------Commit1---------------------------------------
-F3--------------------------Commit1---------------------
-Development-------Merge-F1------------Merge-F2----------

开发分支是最前沿的,会作为夜间构建的一部分发布。当我们对其满意时,该分支将合并到一个暂存分支中,然后用于客户审查。
-F1---Commit1---Commit2---------------------------------------------
-F2--------Commit1--------------------------------------------------
-F3-------------------------Commit1-----Commit2---------------------
-Development-------Merge-F1------------Merge-F2---------------------
-Staging-------------------------------------------Merge-Development

客户在测试环境上审查了此版本,但对F1不满意。与此同时,F3已经代码完成,客户希望审核。
问:我们如何使用git才能使我们的暂存分支只有F2和F3供审核,而不是客户现在拒绝的F1?
答:通过创建一个新的分支并将F1回退到以前的提交状态或者通过rebase来移除F1,然后将该分支推送到暂存分支上,即可使暂存分支只包含F2和F3。

我们正在尝试解决同样的问题,即某个特定功能有可能已经进入到了暂存区,但却被客户停止了,而该软件包中的其他功能仍需继续使用。+1 - Dave S
4个回答

7
你基本上有两个选择:
  1. 还原在Development分支中的F1合并,然后将其合并到Staging分支。
    F1将从DevelopmentStaging分支中消失。

  2. Staging分支重置到合并F1之前的提交,然后手动合并F2F3
    你最终会得到Staging分支不是Development分支的子集。
    只有F1将从Staging分支中消失。


5
一个非常流行的工作流是 git-flow。这基本上是一个非常灵活的模型。这并不意味着你必须完全按照描述的方式去做,但你可以从中获得灵感。
在这种情况下,一个好的解决方案是创建一个专门用于向客户展示的临时审核分支。
这个分支可以直接基于develop创建,也可以基于staging并合并特定的功能。
在客户审核之后,你可以将已接受的功能合并到staging分支或特定的发布分支中,并删除临时审核分支。
这样,你就不必为长期存在的分支重写历史记录。

我们正在考虑使用git revert来删除合并,但如果我们有多个合并,这可能会变得有点棘手。Git-flow非常好,我们正在松散地基于它来制定我们的工作流程。 - Richard Read
我们想出的解决方案是,如果有需要删除一个或多个功能,我们可以将开发和暂存分支“刮掉”或git重置到合并之前的状态。我可以想象,尝试执行多个还原操作会变得非常复杂。 - Richard Read
1
使用 revert 撤销合并实际上并不会撤销合并。这意味着在 git 中,分支仍然被合并,再次合并该分支并不容易。 - Ikke

3
你可以使用git revert命令来撤销合并提交。
你需要指定要撤销的合并提交和要保留的父级分支。
Development $ git revert -m 1 <Merge-F1 SHA>

警告. 还原合并提交表示您永远不希望保留合并所引入的树更改。因此,后续的合并只会引入以前还原的合并的祖先之外的提交所引入的树更改。这可能是您需要的,也可能不是。 (请参见git revert

关于警告的注释. 如果您想重新引入F1,则必须重新基于F1提交,这样仍然可以合并它们。


1
我现在处于“警告评论”阶段,一个功能已经合并并撤销,现在准备再次合并。你能否给我更多关于如何正确地变基的细节? - Scott S

1
我们的项目流程非常相似。我们的工作方式是有两个环境来展示给客户:
  • 开发环境
  • 测试环境
我们首先从开发分支部署到开发环境,客户在此环境中逐个测试功能。
然后,我们仅将客户满意的功能合并到staging分支。
最后,我们将最终的预发布版本部署到测试环境进行最终审核。
在这种情况下,我们永远不必删除功能,只需进行小修补即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接