php - Git - 每个开发人员多台机器 - 跨机器提交但不提交到主分支

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

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

我们有如下设置:

  • 实时服务器,“实时”
  • 内部开发服务器,“本地”(git 服务器,svn 守护进程,所有存储库都驻留在这个服务器上)
  • 工作站 (iMac)
  • 家用电脑(主要是 linux 电脑)

  • 我已将我们的源代码转换为 git 存储库,并将其提交给“本地”。一切都很好,当我克隆它时,它会将 master 分支复制到我的本地环境中,无论我在家还是在工作中。 pull 实时服务器也很有效,它将主分支更改 pull 入实时环境。但我想有以下可能性:
  • 我希望能够在不推送到 master 分支的情况下在工作站上进行开发和提交,但我希望这些更改也能反射(reflect)在我的家用机器上。换句话说,我希望能够进行部分更新或功能、提交并继续在家中处理它,而不会将其 pull 入任何类型的实时分支。这是通过分支完成的吗?我提交然后推送到特定分支?请注意,使用家用计算机跟踪工作站 git 存储库是不可能的,因为工作站并不总是打开(任何在 Mac 上运行过 Java 应用程序的人都知道它最多只能保持几个小时)
  • 我希望每个开发人员都能够在自己的应用程序部分工作,而无需我们相互依赖。是否建议使用 per-dev-branches 来执行此操作,还是应该制作 per-feature-branch?
  • 当一个功能的工作完成时,是否建议将分支 merge 到主存储库,然后将主存储库更新 pull 入实时环境,或者我们应该为此目的有一个单独的“生产”分支?通常如何处理通过 git 进行的实时部署?由于我们的发布频率约为每天 10 次修订(非常快的开发周期),到目前为止,SVN 工作得非常好,因为我们的实时站点只是存储库的 check out ,每当更新准备好时,我们就调用 svn update on实时服务器上的那些文件。与 git 相关的任何最佳实践?

  • 编辑:

    我对这一切如何运作的假设的实际示例:假设我们的项目是“项目”,我们有开发人员“dev1”、“dev2”和“dev3”,每个人有 2 台机器。团队有 3 个任务:“bug”、“特性”和“协作”。 Bug 分配给 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
    

    这个开发人员现在如何将他的修复程序 merge 到主存储库中,以及一旦完成 merge ,他如何删除所有机器上的错误分支?我希望当人们进行更新或获取或其他任何事情时,错误分支消失,以防他们检查或检索它。

    ========

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

    “功能”已分配给“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”之前做了什么,但如果我想对它进行一些我自己的更改,我不应该被允许这样做,我应该改为为该给定分支发出 pull 请求,并且 dev1 应该必须手动接受我的更改 - 我不应该强制他这样做。

    最佳答案

    TL;博士

    使用 git flow .

    它将删除问题并自动处理您所询问的一些问题。当您熟悉 git flow 和分支等时,您可以轻松选择以不同的方式做事 - 或手动。

    更改也将反射(reflect)在我的家用机器上

    在您的 imac 上推/pull 到非主,在您的家用机器上从非主推/pull 。

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

    每个开发分支

    由您决定,您的工作流程需要帮助而不是阻碍开发。例如。如果两个开发人员在同一任务上进行协作 - 你想强制他们在不同的分支工作吗?功能分支可能更有意义,但拥有用户分支并没有错。

    单独的生产分支

    不管你怎么做 - 您的实时应用程序应该从已知的稳定标签/分支中提取 ,通常 不要直接推送给master ,因为破坏事物是开发的一部分,但是破坏您的实时应用程序将从中提取的代码是您绝对想要避免的。您应该能够在任何时候毫无疑问地进行实时安装,您可能会引入损坏的代码。如果您使用的是 Continuous Integration server如果所有测试都通过,您可以轻松地从开发分支自动 merge 到 master,甚至自动部署。

    当分支完成时

    所有的工作流程疑虑都是一样的。当一个分支完成后,你将它 merge 到你的主分支。

    IE。

    $ 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
    

    这表明可以安全地删除 work-on-this。无论如何 - git branch -d如果您在执行命令时尝试删除未与您所在的分支 merge 的分支,则会触发警告并中止。

    如果您发现有多个远程分支被认为已经完成 - 您可以使用一个命令清理它们:
    $ git remote prune -n origin
    
    -n标志意味着它只会报告它将要删除的分支 - 删除该标志以实际删除过时的远程分支

    如果您有多个开发人员在同一个分支上工作(协作)沟通是关键不要依赖工作流程,在让你的团队成员在(据称)完成的分支中工作之前积极讨论删除内容。

    限制分支提交权限

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

    一些建议:
  • 任何人都可以创建远程分支
  • 没有人提交/merge 到 master(只有首席开发人员这样做)
  • 没有人删除远程分支(只有首席开发人员这样做)
  • 没有人修剪远程服务器(只有首席开发人员这样做)

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

    关于php - Git - 每个开发人员多台机器 - 跨机器提交但不提交到主分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9716608/

    相关文章:

    php - 如何检索用户的新闻列表(VK.com)?

    javascript - 发送表单而不刷新

    javascript - 单击全日历上的下个月按钮不起作用时触发事件

    git - 在 git 控制下获取 node_modules 中的 npm 模块

    visual-studio - TFS 获取最新版本,不带只读标志

    php - 将列表变成列

    git - 如何从头到尾查看 git diff?

    git - 对多个分支进行相同更改的最佳方法是什么?

    version-control - S3 中的版本控制 Assets /资源,并集成到代码中

    version-control - TFS 2017 - 如何构建/交付仅更改的文件?