草庐IT

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

coder 2024-04-15 原文

我们正在从 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 - Git - 每个开发人员多台机器 - 跨机器提交但不提交到主分支的更多相关文章

    1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    2. Ruby Sinatra 配置用于生产和开发 - 2

      我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

    3. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

      我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

    4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

      这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

    5. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

      我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

    6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

      无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

    7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

      在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

    8. 微信小程序开发入门与实战(Behaviors使用) - 2

      @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

    9. git使用常见问题(提交代码,合并冲突) - 2

      文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

    10. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

      了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

    随机推荐