GitHub Flow和GitLab Flow有什么区别?

时间:2016-10-07 12:55:27

标签: git github version-control gitlab

最近,我在GIT中找到了工作流程的三个概念:GitFlow,GitHub Flow和GitLab Flow。我已经阅读了关于它的好文章(https://docs.gitlab.com/ee/workflow/gitlab_flow.html),但我不太了解GitLab Flow。也许是因为我不是母语:)

简而言之。

GitFlow(https://docs.gitlab.com/ee/workflow/gitdashflow.png)。

我们有一个主分支作为生产分支。我们还有一个开发分支,每个开发人员都会合并他的功能。有时我们会创建一个发布分支来在生产中部署我们的功能。如果我们在发布分支中有错误,请修复它并将更改拉入开发分支。如果我们在生产中存在严重错误,请创建新的修补程序分支,修复错误并将分支与生产(主)合并并开发分支。

如果我们很少展示我们的工作成果,这种方法非常好。 (也许每2周一次)。

GitHub Flow(https://docs.gitlab.com/ee/workflow/github_flow.png)。

我们有一个主分支作为生产分支。我们(作为开发人员)只能创建分支以添加新功能或修复错误并将其与生产(主)分支合并。听起来很简单。这种方法适用于极端编程,其中生产分支在一天内被多次部署。

GitLab Flow(https://docs.gitlab.com/ee/workflow/production_branch.pnghttps://docs.gitlab.com/ee/workflow/environment_branches.pnghttps://docs.gitlab.com/ee/workflow/release_branches.png)。

我见过新的术语,如预生产,生产,发布(稳定)分支和临时环境,预生产环境,生产环境。他们之间有什么关系?

我理解这一点:如果我们需要添加新功能,我们将从主分支部署预生产分支。完成功能后,我们从预生产分支部署生产分支。预生产分支是中间阶段。然后主分支从生产分支中提取所有更改。

如果我们想要查看每个单独的功能,那么这种方法很好。我们只是在分行结账我们需要什么,看看。

但是如果我们需要展示我们的工作,我们会尽可能晚地创建一个带有标签的发布分支。如果稍后我们修复master分支中的错误,我们需要将它们挑选到最后一个发布分支。最后,我们有一个带有标签的发布分支,可以帮助我们在版本之间移动。

我的视力是否正确? 拉和樱桃选择有什么区别?

2 个答案:

答案 0 :(得分:20)

GitLab Flow 建议也使用masterfeature分支。功能完成后,我们将其合并回master分支。此部分与 GitHub Flow 中的内容相同。

然后我的理解是,根据它是SAAS应用程序还是移动应用程序(可以向世界发布),它们为我们提供了两种选择,如何做到这一点。

如果这是SAAS应用程序,我们使用环境分支,例如pre-productionproduction。当我们准备部署应用程序时,这些分支是在master之外创建的。每个环境具有不同的分支允许我们设置CI / CD工具以在对这些分支的提交上自动部署。如果存在严重问题,我们会在featuremaster分支中对其进行修复,然后将其合并到environment分支。

对于可以向全世界发布的应用程序(例如移动或桌面应用程序),我的理解是他们建议使用release分支而不是环境分支来使用不同的模型。我们仍然在feature分支中完成所有工作,并在完成后将它们合并回master分支。然后,当我们确保master分支足够稳定,即我们已经执行了所有测试和错误修复时,我们创建release分支并发布我们的软件。如果存在严重问题,我们首先在master分支中修复它,然后选择修复release分支。

答案 1 :(得分:13)

自从这篇文章被提出以来已经有一年了,但是考虑到未来的读者以及事情已经发生了一些变化,我认为这值得让人耳目一新。

GitHub Flow originally depicted by Scott Chacon in 2011假设在feature branch上审核后的每次更改都会立即部署到生产中并合并到master。虽然这在当时工作并且符合唯一的GitHub Flow规则,其中主分支中的任何内容都是可部署的it was quickly discovered,以便保持master真实的记录已知的正在运行的生产代码实际部署到生产应该从feature branch 之前合并到master。从feature branch进行部署非常有意义,因为在任何问题的情况下,可以通过向master部署master来立即恢复生产。请查看a short visual introduction到GitHub Flow。

GitLab Flow 是对GitHub Flow的扩展,伴随着一组旨在进一步标准化流程的guidelines and best practices。除了促进准备部署uat分支和功能分支(与GitHub Flow相同)之外,它还引入了其他三种分支:

  1. Production branch
  2. Environment branchespre-productionproduction1-5-stable
  3. Release branches1-6-stablepackage eubot.controller; import eubot.dictionary.EubotDictionary; public class EubotController { public EubotDictionary getDictionary(String stringInput) { EubotDictionary dictionary = null; String found = null; for (String string1 : EubotDictionary.keyWord) { if (stringInput.contains(string1)) { dictionary = new EubotDictionary(); dictionary.setTesto(stringInput); System.out.println("the string contains : " + string1); found = string1; String splittable = stringInput.substring(stringInput.indexOf(found) + found.length(), stringInput.length()); // System.out.println(splittable); for (String string2 : EubotDictionary.parameter) { if (splittable.contains(string2)) { dictionary = new EubotDictionary(); dictionary.setTesto(splittable); found = string2; String splittable1 = string2.valueOf(string2); System.out.println("the parameters are : " + splittable1); } } break; } } return dictionary; } public EubotDictionary findParametro(String stringInput) { EubotDictionary dictionary = null; for (String string2 : EubotDictionary.parameter) { if (stringInput.contains(string2)) { } dictionary = new EubotDictionary(); dictionary.testo = stringInput; } return dictionary; } } package eubot.dictionary; public class EubotDictionary { public String testo; public String getTesto() { return testo; } public void setTesto(String testo) { this.testo = testo; } public static String[] keyWord = { "devo andare", "voglio andare", "vorrei andare", "devo recarmi"}; public static String[] parameter = { "bari", "roma", "milano", "pisa", "firenze", "napoli", "como", "torino" }; public static String[] req; } package eubot.test; import java.util.Scanner; import eubot.controller.*; import eubot.dictionary.*; public class Test { public static void main(String[] args) { System.out.println("<<-|-|-|-|-|-|-|-|-|<<<Welcome In EuBot>>>|-|-|-|-|-|-|-|-|->>"); EubotController controller = new EubotController(); Scanner input = new Scanner(System.in); String string; while (true) { string = input.nextLine(); EubotDictionary dictionary = controller.getDictionary(string); } } }
  4. 我相信上面的名字和例子都是自我描述的,因此我不会进一步详述。