我们有这样的场景:对于生产中的任何应用程序配置变更,我们创建2个PR:一个用于实施,另一个用于回滚。我们提前创建这些。然后,我们让它们经过审核和批准。
在变更窗口期间,我们没有任何人来审查请购单。因此,我们必须提前创建请购单并获得批准。
比方说,master分支包含一个配置文件www.example.com,具有以下2个属性:app.properties with below 2 properties: test.base.certificate=abcd
测试基础密钥= abcd
我们创建实施PR,如下所示:
1.从master创建实现分支。
1.使用新值更新属性,如下所示:
检测基础证书= efgh
测试基础密钥= efgh
1.提交更改。
1.将更改推送到远程。
我们创建回退请购单,如下所示:
1.从主体创建回滚分支。
1.使用新值更新属性,如下所示。
检测基础证书= efgh
测试基础密钥= efgh
1.提交更改。
1.还原为旧属性值:
测试基础证书= abcd
测试基础密钥= abcd
1.提交更改。
1.将更改推送到远程。
Rollback PR没有显示app.properties中的任何差异。这是因为在第二次提交之后,master分支和rollback分支中的文件之间没有任何差异。
在产品更改窗口中,我们首先合并实施PR和测试。如果在测试过程中出现任何问题,我们将合并回退PR以还原更改。
最近第一次做回滚活动,合并回滚PR后,发现master分支的www.example.com仍然有新的属性值:app.properties in the master branch still had the new property values:
检测基础证书= efgh
测试基础密钥= efgh
在高层次上,看起来这个方法应该是有效的。有人知道为什么它不起作用吗?在这种情况下如何创建回滚PR?
我知道git revert,但是我很好奇为什么上面的方法不起作用。
先谢了!
1条答案
按热度按时间brccelvz1#
从高层次上看,这种方法似乎应该奏效。
我猜你认为
git merge rollback
会把rollback
特有的两次提交回放到当前分支(main
)上,如果git这么做了,那么第一次提交不会做任何事情,因为main
已经有了修改,第二次提交会把属性文件恢复到原来的状态,这是你所期望的,但这不是git merge
的工作方式。git merge
不重播提交git merge
默认情况下执行的操作称为三路合并,如an answer to another question中所述:你最好去寻找一个3路合并算法的描述,一个高层次的描述应该是这样的:
1.找到一个合适的合并基
B
--一个文件版本,它是两个新版本(X
和Y
)的祖先,通常是最近的这样的基(尽管在某些情况下它将不得不回到更远的地方,这是git
的默认recursive
合并的特性之一)1.执行
X
与B
以及Y
与B
的差异。1.仔细检查两个差异中的变更块,如果双方在同一个地方引入了相同的变更,接受其中一个;如果一方引入了一项变更,而另一方不涉及该区域,则在期末考试中引入该变更;如果两者都在一个点上引入了更改,但它们不匹配,则将冲突标记为要手动解决。
git merge docs有一个不太详细的解释,但准确地解释了让您困惑的行为:
对于使用3路合并的策略(包括默认的ort),如果在两个分支上都进行了更改,但后来在其中一个分支上恢复了更改,则该更改将出现在合并结果中;有些人会觉得这种行为令人困惑。2这是因为在执行合并时只考虑了头文件和合并基文件,而不是单个提交。3因此合并算法会将恢复的更改视为没有更改,并替换更改后的版本。
我相信这样做的原因有几个:
rollback
是一个特性分支,你不想让它覆盖impl
所做的更改。git merge -s ort -X theirs rollaback
)或使用其他命令(如cherry-pick
或rebase
)来实现其他行为,具体取决于您的具体需要。溶液#1:
git revert
取消
rollback
分支,只使用git revert
:这是最简单的
溶液#2:从
impl
分支rollback
如果出于某种原因,您 * 必须 * 通过PR执行此操作,或者出于任何原因 * 必须 * 具有
rollback
分支,则从impl
分支rollback
,而不是master
:它看起来像这样:
合并
impl
以进行部署:合并
rollback
以回滚:不仅
app.properties
会像你预期的那样被还原,而且git历史记录也更简单,更好地描述了发生的事情。将它与你当前方法的结果进行比较,你当前的方法有两个相同的冗余提交(2和3),并在开始时误导性地分裂成三个分支。如果允许
fast-forward
合并,效果会更好。部署结果如下所示:
和回滚,如下所示: