Git 工作流程(开发>预生产>生产)基础技术问题

11

我对Git(以及VC)相当陌生,我有点难以理解使用分支进行Dev>Staging>Live工作流的概念。

我正在尝试应用这个工作流程的一部分,该工作流程使用dev分支和relase分支而不是固定的staging

在尝试使用Git之前,我使用SVN完成了“相同”的工作流程。但是,我们使用单独的存储库而不是为每个阶段创建分支。现在我正在尝试使用分支,事情有点模糊。

我可以理解工作流背后的思想,但从技术角度来看,我不能理解它。

我正在遵循以下步骤来创建它:

创建文件夹

user:/var/www/$ mkdir dev.example.local
user:/var/www/$ mkdir staging.example.local
user:/var/www/$ mkdir example.local

初始化存储库

user:/var/www/example.local$ git init
user:/var/www/example.local$ git remote add origin git@bitbucket.org:user/example.com.git
user:/var/www/example.local$ echo "README" > README
user:/var/www/example.local$ git commit -am "First"
user:/var/www/example.local$ git push origin master

user:/var/www/example.local$ cd ../dev.example.com
user:/var/www/dev.example.local$ git clone git@bitbucket.org:user/example.com.git .
user:/var/www/dev.example.local$ git checkout -b dev
user:/var/www/dev.example.local$ git push origin dev

user:/var/www/dev.example.local$ cd staging.example.com
user:/var/www/staging.example.local$ git clone git@bitbucket.org:user/example.com.git .

在 dev 分支上进行了一些工作

user:/var/www/dev.example.local$ echo "New" > newfile
user:/var/www/dev.example.local$ git add .
user:/var/www/dev.example.local$ git commit -am "Some new file"
user:/var/www/dev.example.local$ git push origin dev

当准备发布新版本时

user:/var/www/staging.example.local$ git fetch
user:/var/www/staging.example.local$ git checkout -b release-0.1 dev
user:/var/www/staging.example.local$ git push origin release-0.1

user:/var/www/staging.example.local$ cd ../example.com
user:/var/www/example.local$ git fetch
user:/var/www/example.local$ git merge --no-ff origin/release-0.1
user:/var/www/example.local$ git tag -a "0.1"
user:/var/www/example.local$ git push origin master

user:/var/www/example.local$ cd ../dev.example.com
user:/var/www/example.local$ git merge --no-ff master
user:/var/www/example.local$ git push origin dev

我相信我没有按照正确的步骤进行操作。那么,以下是正确的步骤:

  • 创建名为dev, staging, live的文件夹,并在每个文件夹中初始化git仓库?
  • 检出/合并新版本?
  • release合并到live?
  • 创建整个环境?

另外:

  • 在哪里运行这些git命令?在我的本地repo上吗?还是在每个阶段都要运行?

相关信息:

  • 我正在使用BitBucket
  • 这是为网站(Drupal)开发而做的
  • 我的master分支是live阶段
  • 大约有3位开发人员同时工作,每个人在不同的国家
2个回答

14
你不需要创建不同的存储库。你应该学习并且可能会喜欢Git的一个特点,就是它很容易用分支来工作。所以第一步:

  • 忘记你从SVN背景中知道的任何东西

现在我们已经准备好了,这里是想法。假设你目前只有一个master在你的Bitbucket上:

  • 克隆存储库:

$ git clone git@bitbucket.org:user/example.com.git
$ cd example.com
  • 创建你的分支:

    $ git branch dev
    $ git branch staging
    
  • 让其他人知道这些分支:

  • $ git push origin dev
    $ git push origin staging
    
  • 开始工作吧!

  • $ git checkout dev
    $ touch new_file
    $ git add new_file
    $ git commit
    $ git merge master         # and resolve conflicts
    $ git checkout master
    $ git merge dev
    $ git push origin
    

    注意:上面的示例是一个简单的分支-实验-合并,可能不反映您教程的确切工作流程。

    简而言之,您没有不同的存储库,而是在单个存储库中有分支。在这些分支之间,您可以使用任何工作流程尽可能多地进行合并。您可以拥有其他分支,它们未推送到来源,因此对其他人隐藏。当然,您还应该定期git fetch/git merge想要工作的分支,以确保您从其他协作者那里获取最新更改。


    很好,真的澄清了一些问题 :)。现在,我该如何创建新版本并将更改合并到实时站点?我的生产站点应该有git存储库,或者有一种智能的方法将更改部署到另一个服务器(我需要一个开发、暂存和实时域名)? - dmmd
    @jlcd,我对网络术语不是很熟悉,如果有用词不当请见谅。你可以通过两种方式发布软件。一种是通过“git tag”进行固定发布。标签只是标记特定提交记录,以便以后引用。更多信息请参见这里。另一种选择是创建一个与版本号相同的分支。使用该方法,即使项目已经前进到下一个版本,也可以通过添加修复来更新发布。 - Shahbaz
    现场网站,如果这意味着您的服务器创建HTML页面,则可以通过两种方式从存储库获取代码。您可以选择最新版本,但不包括整个存储库(使用git archive),或者拥有存储库的副本。在前一种情况下,您将不得不删除并重写新版本,而在第二种情况下,您将执行git fetch/git merge。前一种情况需要更少的空间,因为它不包括存储库的历史记录。 - Shahbaz
    如果你说的生产环境是指你编写代码的计算机,那当然你会有一个代码库的副本。就像你在自己的计算机上有一个代码库的副本,并且将更改推送到远程(或从远程获取/合并),你也会在其他任何你或其他人可能使用的计算机上有一个副本。 - Shahbaz
    @jlcd,没问题。我自己从stackoverflow学习了基础知识,现在只是回馈社区。 - Shahbaz
    显示剩余2条评论

    0

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