Git在合并时如何排除还原提交?

3
我们使用长期分支PROD、TEST和DEV。
下一个应用程序版本在DEV中开发,一旦准备好进行测试,就会合并到TEST中,发布后再合并到PROD中。
一些提交直接在TEST分支中进行(用于修复正在测试的版本的错误),在PROD中进行(用于维护错误)。
这些PROD和TEST中的提交总是“向下合并”到子分支中(即:PROD合并到TEST和DEV;TEST合并到DEV)。
偶尔会在PROD中提交一个错误更正,然后将其合并到TEST和DEV,然后推送到源。但是,如果规划发生变化,错误更正应该成为测试版本的一部分,而不是PROD版本的一部分。
现在问题来了:如果我撤销PROD中的提交,当PROD向下合并时,TEST和DEV中的撤销也会被执行。如何处理以删除PROD中的更改,并保持它在TEST和DEV中,即使在PROD向下合并后也是如此?
我目前的做法是从TEST开始:
git merge PROD --no-commit

这使我能够在将合并提交到测试环境之前,从生产环境中丢弃已还原的更改。然后,在不需要特殊干预的情况下,将测试环境中的更改合并到开发环境中。

如果要合并的唯一提交是被还原的提交,则会导致合并时没有文件...但尽管如此,这似乎仍然有效。

因此,我想知道我的方法是否正确,或者是否有更好的方法?

1个回答

3
通常情况下,将生产分支合并回测试分支是一个不好的想法。正常情况下应该执行git checkout PROD,然后执行git merge TEST。(如果您想了解更多关于这个经验法则的信息,可以查看这篇有关合并和分支的博客文章,其中提供了完整的理由。)
如果某人意外地在PROD上提交了一个本应在TEST上的修复,那么您应该在TEST上挑选该修复并在PROD上撤销它。为了逐步描述该过程,让我们假设包含在PROD上的修复的提交对象名称为A。那么:
 # cherry-pick the commit onto `TEST`.
 git checkout TEST
 git cherry-pick A

 # Now revert the commit on `PROD`:
 git checkout PROD
 git revert A

现在当您将 TEST 合并到PROD 中时,修复程序应该被合并。 (根据历史记录,可能会产生冲突,但如果有冲突,则应以 TEST 版本为准解决。)

抱歉,我不理解您将TEST合并到PROD的建议...实际上是相反的,我想让TEST与PROD保持最新状态,直到TEST准备好发布(只有在那时才将TEST合并到PROD)。 - Guillaume Morin
看了你提到的博客文章,我不确定我是否完全理解不将集成分支(父分支)合并到特性分支(子分支)的完整理由。在我们的情况下,在哲学观点上,我们可以说每个子分支的目的是“向父分支的最新版本添加功能 xxx”,而不是“向分支派生版本添加功能 xxx”。我们不介意无法将测试分支合并到旧的生产代码库中(例如:测试分支上次合并到生产分支),因为我们只有一个应用程序的生产版本,没有任何特定于客户的版本。 - Guillaume Morin
从技术角度来看,我认为将父分支合并到子分支比挑选某些提交更好...因为我的快速尝试使用 cherry-pick 在子分支合并回父分支时导致了许多冲突。 - Guillaume Morin
@Guillaume Morin:我相信使用git cherry-pick是从一个分支中挑选单个bug修复提交到另一个分支的标准方法,其中您不一定希望在该分支中包含所有其他提交。(例如,请参见此问题。)如果您愿意将PROD合并到TEST中,并且您解释这些分支的目的的方式符合该帖子指南的上下文,那么没问题-我只是描述了我通常认为是良好实践的内容。 :) - Mark Longair
我很惊讶合并包含cherry-pick提交的分支会创建如此多的冲突,特别是如果它已在您的“HEAD”中撤销。 - Mark Longair

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