最近,我在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.png,https://docs.gitlab.com/ee/workflow/environment_branches.png,https://docs.gitlab.com/ee/workflow/release_branches.png)。
我见过新的术语,如预生产,生产,发布(稳定)分支和临时环境,预生产环境,生产环境。他们之间有什么关系?
我理解这一点:如果我们需要添加新功能,我们将从主分支部署预生产分支。完成功能后,我们从预生产分支部署生产分支。预生产分支是中间阶段。然后主分支从生产分支中提取所有更改。
如果我们想要查看每个单独的功能,那么这种方法很好。我们只是在分行结账我们需要什么,看看。
但是如果我们需要展示我们的工作,我们会尽可能晚地创建一个带有标签的发布分支。如果稍后我们修复master分支中的错误,我们需要将它们挑选到最后一个发布分支。最后,我们有一个带有标签的发布分支,可以帮助我们在版本之间移动。
我的视力是否正确? 拉和樱桃选择有什么区别?
答案 0 :(得分:20)
GitLab Flow 建议也使用master
和feature
分支。功能完成后,我们将其合并回master
分支。此部分与 GitHub Flow 中的内容相同。
然后我的理解是,根据它是SAAS应用程序还是移动应用程序(可以向世界发布),它们为我们提供了两种选择,如何做到这一点。
如果这是SAAS应用程序,我们使用环境分支,例如pre-production
和production
。当我们准备部署应用程序时,这些分支是在master
之外创建的。每个环境具有不同的分支允许我们设置CI / CD工具以在对这些分支的提交上自动部署。如果存在严重问题,我们会在feature
或master
分支中对其进行修复,然后将其合并到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相同)之外,它还引入了其他三种分支:
Production
branch pre-production
,production
,1-5-stable
1-6-stable
,package 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);
}
}
}
我相信上面的名字和例子都是自我描述的,因此我不会进一步详述。