git - 从 Git Flow 中的发布中删除功能

标签 git version-control merge git-flow

我在一个拥有大型 Java 代码库(30 万多行代码)的团队工作,该团队最近采用 Git 作为源代码控制(从 ClearCase 迁移而来)。我们正在使用 Git Flow作为我们的分支策略。有几个我们经常遇到的用例,我们一直在努力解决。

  1. 我们已将所有功能 merge 到开发分支中,以便在即将发布的版本中使用。当我们接近发布时,事实证明有一项功能无法上线(由于客户端未准备好,或其他原因)。创建发布分支但遗漏特定功能(跨越许多提交)的最佳方法是什么?该功能需要可用才能包含在下一个 future 版本中。我们之前尝试过的是对所有提交执行“git revert”,创建发布分支,然后对还原的提交执行“git revert”。这是一种非常痛苦的方法,尤其是对于大型特征。

  2. 我们已经创建了发布分支,但在发布上线之前,确定需要删除一个功能。与第一个用例类似,此功能需要能够进入下一个版本。因此,仅对提交执行“git revert”并不能完全解决问题,因为当我们执行“git flow release finish”时,还原将返回 merge 到开发分支中。

    <

如 Git Flow 模型中所述,所有提交都在功能分支上进行,而不是直接在开发分支上进行。当一个功能完成并为下一个版本做好准备时,它就会被 merge 到开发中。当下一个版本发布时,发布分支是从开发中创建的。在发布经过回归测试并在必要时进行修复后,它将进入生产并 merge 到 master,并在错误修复的情况下返回开发,并标记版本号。当我们认为将在下一个版本中出现的功能最终需要被排除在外时,就会出现上述问题。

处理这些情况的最佳方法是什么?在这两种情况下,分支已被许多开发人员发布和撤消,因此弄乱历史会造成困难。我知道这些不太理想,但不幸的是,情况超出了我们的控制。

最佳答案

在 Git 中, merge 提交做两件事。首先它创建 merge 历史,因此 Git 知道什么已经 merge ,什么还没有 merge 。其次,它将来自两条不同工作线的变化结合在一起。

您可以在这两个方面欺骗 Git,这听起来像是您需要做的。有两种方法可以在不保留更改的情况下创建 merge 历史

git merge --strategy=ours 

git merge
git revert -m 1 MERGE_SHA

前者创建一个 merge 提交(和 merge 历史),但遗漏了所有通常会被 merge 的更改。后者创建一个 merge 提交(和 merge 历史)并 merge 更改,但随后立即删除所有的变化,同时保留第一个历史。

在你的例子中,如果你 merge 了一些东西然后改变了主意,你会想要使用第二种形式并恢复 merge SHA。现在,为了防止 merge 的更改传播到不同的分支,您需要使用第一种形式。请注意,为了有效地使用第一种形式,您可能必须一次 merge 一个 SHA(或为此使用额外的功能分支)。

假设你有一个分支 trouble 包含 6 个提交(1-6),你需要将 trouble merge 到 master 中,但你不想 merge Commit 4 中引入的更改。而不是 git merge trouble 你会这样做

git merge 3 # merges 1/2/3
git merge -s ours 4 # creates merge history for 4, but does NOT merge any changes from 4 
git merge trouble # merges 5/6

关于git - 从 Git Flow 中的发布中删除功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26417071/

相关文章:

git - 如何将文件移动到github中的文件夹?

git - 如何修复坏的 git 树对象

javascript - Three.js 合并几何和八叉树选择

git - 如何摆脱git中的 merge 提交

c++ - Relation和大多数Merge Operation的计算?

git - 无法访问Github 403错误: Permission Denied

git - Netbeans 7.2 Git 克隆 ssh

git merge squash - 当我想要的只是我压扁的分支的更改时冲突解决

visual-studio-2010 - 如何配置 Visual Studio 以使用不同的源代码控制提供程序

git - 检查旧提交并维护 master 分支上的头部?