Git - 如何正确还原更改?

Git - how to properly revert changes?

我们最近刚切换到 git(使用 git 流分支模型),当我们需要撤销更改时遇到了一些麻烦。

不幸的是,由于在回归过程中或测试周期相当晚的任何时候发现的问题,我们经常决定不会在发布中发布某个功能。我们可以很容易地恢复要退出的功能分支的合并提交,但是在合并错误更改后剪切的功能分支也将包含该更改,并且可以在应该发布之前将其带回开发或发布分支。

示例:

                               |reverts f1 
 develop-> X---o---o---Y---Z---R---P <- merge f2 to develop picks up f1
            \         /     \     /
        f1-> A---B---C  f2-> D---E

从示例中,f1 被剪切、处理并合并回 develop。 f2 被切断,工作开始。 f1 在提交 R 时从开发中恢复。然后 f2 完成并在提交 P 时合并回开发。提交 P 是问题所在:f1 通过此提交返回开发。现在,我们在还原方面做错了什么吗?有什么方法可以确保还原的提交不会回到开发中吗?我们使用 'revert -m1 ' 恢复。

当我们恢复我们的合并提交时,我们做错了什么吗?有什么方法可以使 f2 从 f1 中提取的提交不会包含在合并回开发中吗?我们是否必须手动还原所有前向功能分支上的那些提交?我们是否应该让开发人员从 Master 中删除所有功能分支,以便我们知道他们不能从可能被还原的功能中获取任何更改?

欢迎提出建议,谢谢!

我认为您的工作流程没有任何问题,除了您必须考虑提交的恢复,因为它适用于所有子项,而不仅仅是开发分支。因为功能分支 f2 也有 f1 的更改,即在您的示例中 f2 = f2 +f1 并且当您将 f2 合并回 git 时认为您也希望 f1 返回。

在上面的示例中,您可以在 f2 分支上包含一个提交 R' 来完成您希望发生的事情。

                               |reverts f1 
 develop-> X---o---o---Y---Z----R----P <- merge f2 to develop picks up f1
            \         /     \       /
        f1-> A---B---C  f2-> D--R'--E
                              **|reverts f1** 

这是假设 f2 是一个长 运行 分支。如果不是,并且您预计它是一个短分支,那么我会推迟恢复 R 并在您将 f2 及其姐妹合并回 develop 后执行此操作。如果您有相当多的功能正在并行处理,这可能会有用。

                                     **|reverts f1** 
 develop-> X---o---o---Y---Z-------P---R-- <
            \         /     \     /
        f1-> A---B---C  f2-> D---E

希望这对您有所帮助。