最佳实践:希望使用git部分拉动提交

最佳实践:希望使用git部分拉动提交,git,version-control,Git,Version Control,我负责一个部门Web服务器,它有很多小的、单页的模块(大多数模块只显示动态生成的报告),还有一些较大的模块,由5-20个不同的html页面组成。几乎所有这些都是在perl中完成的,这里和那里都有一些java助手 只有两台服务器:生产服务器和我的开发服务器,而且不太可能再添加第三台。但是该部门需要快速的周转时间,因此,当有人来到我的办公室询问“你能提供一份报告吗?过去12个月里,哪个酒吧有多少食客”,他们希望这个网页在一两个小时后投入生产。因此,我们没有复杂的构建和部署过程-通常,我在我的开发服务

我负责一个部门Web服务器,它有很多小的、单页的模块(大多数模块只显示动态生成的报告),还有一些较大的模块,由5-20个不同的html页面组成。几乎所有这些都是在perl中完成的,这里和那里都有一些java助手

只有两台服务器:生产服务器和我的开发服务器,而且不太可能再添加第三台。但是该部门需要快速的周转时间,因此,当有人来到我的办公室询问“你能提供一份报告吗?过去12个月里,哪个酒吧有多少食客”,他们希望这个网页在一两个小时后投入生产。因此,我们没有复杂的构建和部署过程-通常,我在我的开发服务器上构建页面,对其进行测试,
git提交
git推送
在开发服务器上,以及
git推送
在生产上。这对每个人都适用

现在我的问题是,当我在一个更大的项目上工作时,我想使用git进行我的更改,即使我还不想让它们生效。同时,我希望能够中断更大的项目,执行一个小任务,提交推拉小任务,并从拉中省略大项目文件。比如说,

git commit -m "First attempt, not finished yet" bigproject/file1 bigproject/file2
然后

然后将
file3
,而不是
file1
file2
拉入生产

就我对git的理解而言,标记对我没有帮助,因为我只能拉取“标记之前的所有内容”,而分支也没有多大帮助,因为我必须提交所有内容,更改分支,在那里做一些工作,再次提交所有内容,然后换回来——在接触一些代码之前,我需要始终知道我要处理哪个分支


所以现在,我在同一台机器上使用两个沙盒,一个用于短期,另一个用于长期,但我怀疑这是解决问题的最佳方法。那么,如何使用git“正确地”实现这一点呢?

听起来分支正是您想要的。查看Git流()

听起来您所描述的是希望进行长时间运行的开发,在准备好之前不会部署,但不会因为这些更改而阻止进一步代码的发布。Git Flow(和其他分支策略)通过拥有一个特性分支来解决这个问题,这些特性分支被合并回主开发分支,然后是用于发布的另一个主分支。这篇文章值得一读,以了解每一篇文章的优点,但简要介绍如下:

  • 我为
    big-project-x
    创建了一个功能分支,它是从develope分支出来的
  • 我在那个项目上工作了一段时间,边做边承诺
  • Bob进来时说“我需要报告Y”,所以我创建了一个
    report-Y
    功能分支,该分支取自develope,不包含任何
    big-project-x
    更改
  • 我完成
    report-y
    ,合并回
    development
    ,然后将这些更改推送到服务器
  • 为了让我的生活更轻松,我将development合并到了
    big-project-x
    ,因此它有了最新的变化
  • 一段时间后,我完成了
    big-project-x
    ,将其合并到
    development
    中,然后推送到服务器
  • 庆祝一下 为了解决您提到的一些缺点:

  • Git提交很便宜,所以如果您正在转换到其他工作,那么无论如何提交都是一个好主意
  • 如果您做了大量更改,然后意识到自己在错误的分支上,那么您可以只使用
    git checkout branchname
    然后提交,但是如果存在冲突,您可以只使用
    git stash
    ,然后使用
    git checkout branchname
    ,然后使用
    git stash apply
    。隐藏是一种很好的方法,可以在您四处跳跃时在短时间内存储更改

  • 要养成经常分支的习惯确实需要一点严格,但一旦习惯了,你就会真正看到Git及其轻量级分支模型的威力。显然,您需要付出一些努力来确保长期运行的分支不会过时(通常从develope合并),但这是我建议的在同一代码基上管理快节奏和慢节奏项目开发的最简单方法。

    另一种方法是使用两个分支,例如,掌握以生产和开发为目的。您在开发分支上完成了所有工作,当您想要在生产中得到一些东西时,您可以使用选择包含所需更改的提交

    在您在问题中描述的特定情况下,如果我们调用第一个提交A和第二个提交B,这两个都将在开发分支中完成。然后,当你想让B投入生产时:

    git checkout master
    git cherry-pick B
    git push
    

    然后像以前一样继续您的工作流程,确保生产服务器位于主分支上。

    @Spikeheap的回答帮助我认识到,在切换分支之前,我不必清理,这意味着分支正是我所需要的

    总而言之,这是我的工作流程,以及必要的git命令,以防有人需要类似的设置:

    要使用的命令:
    • 在每次提交之前,查看我在哪个分支上,这样我就不会提交错误的分支

      git分行

    • 确定哪些文件已更改:

      git状态

    • 决定一些更改应该进入与我所在分支不同的分支。这可以在更改后完成:

      git checkout
      如果分支已经存在

      git checkout master&&git checkout-b
      如果是新的

      git提交

    • 如果
      git checkout
      给我一个冲突:

      git隐藏

      git签出

      git隐藏应用

    • 如果我提交了错误的分支(但尚未推送),请退出:

      git重置——硬头~1

    • git checkout master
      git cherry-pick B
      git push