什么样的Git工作流适合我们的情况?

什么样的Git工作流适合我们的情况?,git,workflow,Git,Workflow,我们目前只有主分支。我们当前的工作流程包括在本地实现这些特性,提交到存储库并更新测试服务器,让客户知道这些特性,如果客户批准了这些更改,我们也会更新产品 问题是,现在我们使用SVN,手动更新已更改的特定文件夹和文件,否则可能会对生产进行不必要的更改。Git作为我们近期的回购协议,已经用于一个项目,什么样的Git工作流/分支将适合我们的需要?Git工作流需要在这种情况下正常工作: 在当地做你的工作。 更新测试服务器并让客户端知道。 如果客户批准了变更,还应更新产品。 理想情况下,我们希望能够将产品

我们目前只有主分支。我们当前的工作流程包括在本地实现这些特性,提交到存储库并更新测试服务器,让客户知道这些特性,如果客户批准了这些更改,我们也会更新产品

问题是,现在我们使用SVN,手动更新已更改的特定文件夹和文件,否则可能会对生产进行不必要的更改。Git作为我们近期的回购协议,已经用于一个项目,什么样的Git工作流/分支将适合我们的需要?Git工作流需要在这种情况下正常工作:

在当地做你的工作。 更新测试服务器并让客户端知道。 如果客户批准了变更,还应更新产品。 理想情况下,我们希望能够将产品更新为一个特定的标签,同时标记所有文件和文件夹。测试和生产可能会对许多开发人员进行一些不同的更改,其中一些需要转移到生产环境中,而另一些则不需要


最初,我想为生产稳定版本设置3个主分支,测试要合并到dev和dev中的测试服务器,我们在其中编写代码。我不确定这是否合适。

在我看来,您不一定需要为每台服务器提供分支-这可能会根据您的忽略和其他一些因素造成一些问题,在上下层叠更改时会出现一些问题。相反,您的各种服务器只需签出一个分支并对其进行更改即可。拥有存储库完整副本的服务器非常非常有用

我们的生态系统最初包括每个服务器、生产、暂存和开发的分支——分支之间的同步更改有时会产生非常令人沮丧的合并问题。目前,我们已经签出了生产分支的所有服务器,我们为自己省去了不少麻烦。在实际启动生产服务器之前,我们会检查那里的所有内容——如果需要测试更剧烈的编码更改,您还可以切换分支。这里有很大的灵活性


我的建议是评估您的工作流,看看您是否可以利用钩子来自动化更新测试/登台服务器的过程。我们用gitolite做得很好。否则,您的工作流程很容易实现,您可以对这个概念进行一些改进,使其进一步自动化。

在我看来,您不一定需要为每台服务器提供分支—这可能会根据您的忽略和其他一些因素造成一些问题,在上下层叠更改时会出现一些问题。相反,您的各种服务器只需签出一个分支并对其进行更改即可。拥有存储库完整副本的服务器非常非常有用

我们的生态系统最初包括每个服务器、生产、暂存和开发的分支——分支之间的同步更改有时会产生非常令人沮丧的合并问题。目前,我们已经签出了生产分支的所有服务器,我们为自己省去了不少麻烦。在实际启动生产服务器之前,我们会检查那里的所有内容——如果需要测试更剧烈的编码更改,您还可以切换分支。这里有很大的灵活性


我的建议是评估您的工作流,看看您是否可以利用钩子来自动化更新测试/登台服务器的过程。我们用gitolite做得很好。否则,您的工作流程很容易实现,您可以对这个概念进行一些改进,使其进一步自动化。

看起来,您不需要3个分支,而是至少需要2个存储库。每个开发人员都有自己的本地存储库,每个人都可以访问拉取,这就是开发分支。然后,测试人员必须知道要测试哪些提交,测试团队负责维护具有工作提交的官方存储库。存储库总数=成员数+2


拥有一个存储库和3个分支master、test、dev并不是一个好主意,因为您的产品最终会发展,您将获得新的功能使用分支,版本分支和标记以及不同的人将为源代码贡献更多分支。

看起来,您不需要3个分支,但更像至少2个存储库。每个开发人员都有自己的本地存储库,每个人都可以访问拉取,这就是开发分支。然后,测试人员必须知道要测试哪些提交,测试团队负责维护具有工作提交的官方存储库。存储库总数=成员数+2

拥有一个存储库和三个分支master、test、dev并不是一个好主意,因为您的产品最终会发展,您将获得新的功能使用分支,版本分支和标记,不同的人将为源代码贡献更多的分支

每个提交都是r 以圆圈表示。 虚线:需要额外合并

序言

这篇文章写得很快,肯定会有错误,但应该对该方法有一个很好的概述。 概述

我们有一个与您非常相似的用例,这是迄今为止我们发现的最优化的解决方案

您将需要3个不同的分支:

master这是您的主要分支,开发人员编写的所有有用代码最终都会出现在这里 生产 预发布->这是一个临时分支。这是在您向客户机演示某个内容到该内容进入生产服务器的时间之间

请注意,生产和预发布最终都是master branch的旧版本,即master,不包括其最新的一些更改。因此,根据客户请求直接对预发布进行的任何更改都应该合并到master。此外,生产分支关键错误修复中的任何更改都应该合并到主分支以及预发布分支(如果它处于活动状态)。这是最重要的事情,否则你会陷入一个类似于在一个Git存储库中拥有不止一个代码库的混乱状态。 对于日常任务:

开发商Foo将:

git pull 
git checkout -b new_feature
然后编写代码并经常提交到新的功能分支。 一旦她做完了:

git pull << to get the latest changes on master (in the picture you see Foo's branch is 2 commits behind master's ~HEAD)
git rebase -i master << -i to be interactive, so she can pull out some of the local changes she's made e.g. local changes config files or customized loggers for her own benefit, etc.
git merge --no-ff master << merge the changes with master
git push << push to the repository
您可能需要为您的测试机器进行一些自定义配置,以便您可以进行分支测试服务器本地更改并将其提供给用户。当您有了新的预发布分支后,就可以执行:git pull和git rebase-i预发布

在这个阶段,如果客户机要求更改,开发人员应该从预发布分支出来,在进行更改合并后,将其分支与主版本和预发布版本合并

生产服务器:

客户批准更改后:

git pull和git checkout生产以及git rebase预发布

你可能想为生产部门服务。或者,如果您有特定于生产服务器的自定义更改,那么最好为it生产更改和本地更改创建一个单独的分支,并进行一些额外的更改,并且始终在生产分支上重新设置其基础

关键错误修复:

假设有人在您的生产服务器中发现一个关键错误,那么Bob将从生产分支创建一个分支,修复该错误,提交它,然后将其分支与生产服务器合并,然后提取并重新设置生产分支的本地更改。但是,更改将不会出现在主控中,因此他还需要与主控合并,如果主控处于活动状态,还需要与预发布合并,并重新设置测试服务器本地更改的基础

注释

在我看来,git不同于SVN,因为我记得那些使用it的丑陋日子,用户应该在必要时进行分支,并尽可能频繁地提交

每个用户都可以而且应该让自己的本地分支拥有自己的所有配置,并将其合并,或者在从3个主要分支中的任何一个分支分支分支时,首先进行选择。在合并回这3个分支中的任何一个分支之前,它们总是可以重新设置-i的基址并删除它们自己的本地更改。生产分支和预发布分支也是如此,对于每个分支本地的所有配置,都应该有一个分支

我喜欢gitolite,我认为它是一个很好的工具,可以在git之上使用它来管理权限,有一种中央回购协议,使git的使用变得更容易

每个提交都由一个圆表示。 虚线:需要额外合并

序言

这篇文章写得很快,肯定会有错误,但应该对该方法有一个很好的概述。 概述

我们有一个与您非常相似的用例,这是迄今为止我们发现的最优化的解决方案

您将需要3个不同的分支:

master这是您的主要分支,开发人员编写的所有有用代码最终都会出现在这里 生产 预发布->这是一个临时分支。这是在您向客户机演示某个内容到该内容进入生产服务器的时间之间

请注意,生产和预发布最终都是master branch的旧版本,即master,不包括其最新的一些更改。因此,根据客户请求直接对预发布进行的任何更改都应该合并到master。此外,生产分支关键错误修复中的任何更改都应该合并到主分支以及预发布分支(如果它处于活动状态)。这是最重要的事情,否则你会陷入一个类似于在一个Git存储库中拥有不止一个代码库的混乱状态。 对于日常任务:

开发商Foo将:

git pull 
git checkout -b new_feature
然后编写代码并经常提交到新的功能分支。 一旦她做完了:

git pull << to get the latest changes on master (in the picture you see Foo's branch is 2 commits behind master's ~HEAD)
git rebase -i master << -i to be interactive, so she can pull out some of the local changes she's made e.g. local changes config files or customized loggers for her own benefit, etc.
git merge --no-ff master << merge the changes with master
git push << push to the repository
您可能需要为您的测试机器进行一些自定义配置,以便您可以进行分支测试服务器本地更改并将其提供给用户。当您有了新的预发布分支后,就可以执行:git pull和git rebase-i pre rele ase

在这个阶段,如果客户机要求更改,开发人员应该从预发布分支出来,在进行更改合并后,将其分支与主版本和预发布版本合并

生产服务器:

客户批准更改后:

git pull和git checkout生产以及git rebase预发布

你可能想为生产部门服务。或者,如果您有特定于生产服务器的自定义更改,那么最好为it生产更改和本地更改创建一个单独的分支,并进行一些额外的更改,并且始终在生产分支上重新设置其基础

关键错误修复:

假设有人在您的生产服务器中发现一个关键错误,那么Bob将从生产分支创建一个分支,修复该错误,提交它,然后将其分支与生产服务器合并,然后提取并重新设置生产分支的本地更改。但是,更改将不会出现在主控中,因此他还需要与主控合并,如果主控处于活动状态,还需要与预发布合并,并重新设置测试服务器本地更改的基础

注释

在我看来,git不同于SVN,因为我记得那些使用it的丑陋日子,用户应该在必要时进行分支,并尽可能频繁地提交

每个用户都可以而且应该让自己的本地分支拥有自己的所有配置,并将其合并,或者在从3个主要分支中的任何一个分支分支分支时,首先进行选择。在合并回这3个分支中的任何一个分支之前,它们总是可以重新设置-i的基址并删除它们自己的本地更改。生产分支和预发布分支也是如此,对于每个分支本地的所有配置,都应该有一个分支

我喜欢gitolite,我认为它是一个很好的工具,可以在git之上使用它来管理权限,有一种中央回购协议,使git的使用变得更容易


我们只有一个存储库,但有几个克隆。你是那个意思吗?是的。Git是分布式的。您可以使用集中式方法作为whitsvn,这是可以的,但使用git的重点并不是分散,而是弱链接。每个开发人员分支都不需要是最新的,面向外部世界的存储库也不需要和测试人员使用的内部存储库相同。一些开发人员也不需要也不希望访问其他团队正在处理的所有开发分支。你是那个意思吗?是的。Git是分布式的。您可以使用集中式方法作为whitsvn,这是可以的,但使用git的重点并不是分散,而是弱链接。每个开发人员分支都不需要是最新的,面向外部世界的存储库也不需要和测试人员使用的内部存储库相同。一些开发人员也不需要也不希望访问其他团队正在处理的所有开发分支。