Git - 每个开发人员的多台机器 - 跨机器而不是主分支机构提交

时间:2012-03-15 09:01:19

标签: php git version-control branch branching-and-merging

我们正在从SVN过渡到git,并且有一些我无法理解的概念。

我们有如下设置:

  • 直播服务器,“直播”
  • 内部开发服务器,“本地”(git服务器,svn守护程序,所有存储库都驻留在此服务器上)
  • 工作站(iMacs)
  • 家用电脑(主要是linux电脑)

我已将我们的源代码转换为git仓库,并将其提交给“本地”。这一切都运行良好,当我克隆它时,它将主分支复制到我的本地环境,无论我在家还是在工作。拉动实时服务器也很有效,它将主分支更改拉到实时环境中。但我希望有以下可能性:

  • 我希望能够在不推送到主分支的情况下在工作站上进行开发和提交,但我希望这些更改也能反映在我的家用机器上。换句话说,我希望能够在家中进行部分更新或功能,提交并继续处理它,而不会被任何类型的实时分支。这是用分支完成的吗?我承诺然后推送到特定分支?请注意,使用家用计算机跟踪工作站git存储库是不可能的,因为工作站并不总是打开(任何在Mac上运行java应用程序的人都知道它最多只能保持几个小时)

  • 我希望每个开发人员都能够在自己的应用程序中工作,而我们彼此不依赖。是否建议使用per-dev-branches,或者我们应该制作每个功能分支?

  • 当功能完成工作时,建议将分支合并到主仓库中,然后将主仓库更新拉入实时环境,或者我们是否应为这些分支单独设置“生产”分支目的是什么?如何通过git进行实时部署?由于我们的发布频率约为每天10次修订(极快的开发周期),SVN到目前为止工作得非常好,因为我们的实时站点只是对存储库的检查,每当更新准备就绪时,我们只需调用svn update on实时服务器上的那些文件。有关git的任何最佳做法吗?

编辑:

关于这一切是如何工作的假设的实际例子:假设我们的项目是“项目”,我们有开发人员“dev1”,“dev2”和“dev3”,每个都有2台机器。该团队有3个任务:“bug”,“feature”和“collaboration”。错误分配给dev1,功能分配给dev2,协作是一个功能,所有三个需要一起工作($ REMOTE是我们本地开发服务器上主要仓库的url,即user @ local:repo.git):

======

予。在当地工作

由于dev1被指定为“bug”,他将负责处理。他做了以下事情:

$git branch bug
$git checkout bug // switches to bug branch
( // edit some files)
$git commit -a -m 'I fixed the bug!'
$git push $REMOTE bug

这个开发人员现在如何将他的修复程序合并到主仓库中,一旦完成合并,他如何在所有机器上删除bug分支?我希望bug分支在人们进行更新或获取时会消失,或者在他们检查出来或者你检索它的时候。

======

II在本地工作,然后继续在另一个位置的同一分支

“feature”已分配给“dev2”,他这样做:

$git branch feature
$git checkout feature // switches to feature branch
( // edit/add some files etc. )
$git commit -a -m 'I made some updates, will continue at home'
$git push $REMOTE feature
// at home, the developer does the following, right?
$git clone $REMOTE -b feature /some_new_folder // if he didn't clone the whole repo previously
or
cd previously_cloned_repo_master_or_whatever
$git fetch
$git checkout $REMOTE feature
( // right? )
( // edit some files then ... )
$git commit -a m 'I finished!'
$git push
// Same as above, what next? How to merge it into all other branches and safely delete the branch afterwards. What happens when someone is in a branch that has been deleted, and makes a pull?

========

III许多人在一个分支上,与主分支分开

“协作”是一项共同努力,将由来自所有6个地点的所有三个开发人员共同努力。它由dev3创建。

$git branch collaboration
$git checkout collaboration // switches to needed branch
( // add something, so we have something to commit)
$git commit -a -m 'Initialized new branch'
$git push $REMOTE collaboration
( // The other two devs can then simply call .. )
$git fetch
$git checkout $REMOTE collaboration
( // And they're ready to go, right? )
( // Each dev then makes his own edits on some areas, commits, and pushes. All pushes change the content of the branch, so that if dev2 pushed and dev1 makes $git pull in the root of the project while on this branch, dev1 will get his changes, right? )

======

此外,是否可以将分支限制为特定的分支创建者?例如,我想看看dev1在删除它之前对“bug”做了什么,但是如果我想对它进行一些自己的更改,我不应该被允许这样做,我应该这样做对该给定分支发出拉取请求,并且dev1应该必须手动接受我的更改 - 我不应该强迫他这么做。

3 个答案:

答案 0 :(得分:3)

<强> TL; DR

使用git flow

它会删除问题并自动执行您要问的一些事情。当您熟悉git flow和分支等时,您可以轻松选择以不同方式执行操作 - 或手动操作。

更改将反映在我的家庭计算机上

在你的imac推/拉到非主控器和家用机器上从非主控器推/拉。

其中“not-master”是您目前正在处理的任何分支。

每个开发分支

由您决定,您的工作流程需要帮助不妨碍开发。例如。如果两个开发人员在同一个任务上合作会怎样 - 你想强迫他们在不同的分支机构工作吗?功能分支可能更有意义,但是拥有用户分支没有任何问题。

单独的生产分支

然而你这样做 - 你的实时应用程序应该来自一个已知的稳定标签/分支,而且通常不要直接推送到主人,因为破坏事物是其中的一部分开发,但打破你的实时应用程序将从中拉出的代码是你绝对想要避免的。您应该能够毫无疑问地随时启动您的实时安装,您可能会使用损坏的代码。如果您使用Continuous Integration server,如果所有测试都通过,您可以轻松地从开发分支自动合并到主控,甚至自动部署。

分支完成后

所有的工作流疑虑都是一回事。完成分支后,将其合并到主分支。

即。

$ git branch working-on-this master
$ git add ...
$ git commit ...
$ # rinse and repeat
$ git push --set-upstream $REMOTE working-on-this

到时候:

$ git checkout master
$ git pull
$ git merge working-on-this
$ git push
$ git branch -d working-on-this
$ git push $REMOTE :working-on-this

您没有明确删除其他计算机上的所有分支;但是任何人都可以随时运行:

$ git branch --merged master

如果分支完成,将如下所示:

$ git branch --merged master
master
working-on-this
$ git branch -d working-on-this

这表明可以安全地删除这项工作。在任何情况下 - git branch -d都会触发警告并在您尝试删除未执行命令时与您所在分支合并的分支时中止。

如果您发现有多个远程分支被认为已经完成 - 您可以使用一个命令清理它们:

$ git remote prune -n origin

-n标志意味着它只会报告它要删除的分支 - 删除该标志以实际删除过时的远程分支

如果你有几个开发人员在同一个分支机构工作(协作)沟通是关键不依赖于工作流程,请在离开你的团队之前积极讨论删除事情(据称完成分支。

限制分支机构提交权限

是的,你可以这样做 - 但你真的想要吗?你最好使用通信和约定。

一些建议:

  • 任何人都可以创建远程分支
  • 没有人提交/合并到主人(只有领导开发者那样做)
  • 没有人删除远程分支(只有领导开发者这样做)
  • 没有人修剪远程服务器(只有领导开发者这样做)

任何 任何人都可以随时执行上述任何操作,但假设您信任整个团队,则没有理由限制开发人员阻止他们这样做 - 可能会有时间他们需要打破排名,规则防止这种情况,而公约则不然。

答案 1 :(得分:1)

  

我希望能够开发和提交..

是的,这是通过分支完成的。最初,您将整个分支从工作站推送到本地&#34;如果你想继续在那里工作,你可以在家里结账跟踪分行。

  

我希望每个开发人员都是......

我建议使用功能分支而不是开发人员分支。当几个开发人员正在合作一个功能时,它会更有意义。

  

在完成某项功能的工作时,是否可取。

这是品味问题。我们通常首先创建一个发布分支(我认为很多人都这样做),所以我们在真实的东西和需要测试的东西之间有一个接缝,当发布分支被认为是稳定的时候我们将该分支合并到master中然后它可以上线。

我认为没有任何最佳做法。这取决于你在做什么,即你正在开发什么样的东西。如果你想保留你的工作流程git将允许你这样做。而不是&#34; svn update&#34;你做了&#34; git pull&#34;。

答案 2 :(得分:1)

您可以为分支机构引入命名约定,并让它们在local上愉快地生活。例如:

在工作中:

work$ git branch -a
  master
* user1/my-work
  remote/local/master
  remote/local/user1/my-work
work$ git push local user1/my-work

在家里:

home$ git branch -a
  master
* user1/my-work
  remote/local/master
  remote/local/user1/my-work
home$ git pull local user1/my-work

为每个用户分配了分支的前缀,因此local可以作为一种中央存储服务器。