使用git管理本地功能分支的最佳方法?

使用git管理本地功能分支的最佳方法?,git,branching-and-merging,feature-branch,Git,Branching And Merging,Feature Branch,我正在研究使用git进行分支管理的一些更精细的方面,并基于本文的一些决策: 现在我们这里有一个稍微简单的场景,远程在origin上我们有master和development\u branch。就所有开发人员而言,development\u branch是克隆的主要场所,只有当我们有一个稳定的版本时,我们才能从开发合并到master 考虑到这一点,我们在每一个sprint阶段都有大量的故事需要完成,因此我们目前要做的是克隆开发分支,然后为我们正在开发的故事/功能创建一个新分支,例如产品描述功能。

我正在研究使用git进行分支管理的一些更精细的方面,并基于本文的一些决策:

现在我们这里有一个稍微简单的场景,远程在origin上我们有
master
development\u branch
。就所有开发人员而言,
development\u branch
是克隆的主要场所,只有当我们有一个稳定的版本时,我们才能从开发合并到master

考虑到这一点,我们在每一个sprint阶段都有大量的故事需要完成,因此我们目前要做的是克隆
开发分支
,然后为我们正在开发的故事/功能创建一个新分支,例如
产品描述功能
。这个本地分支随后被处理,因此如果我们需要执行另一个任务或进行某种修复,我们将有干净的
development\u分支
返回并从中分支

现在,问题围绕着以这种方式工作的过程而来,目前安全选项似乎是以下过程:

  • 克隆
    development\u分支机构
  • 为任务创建新分支(在本例中,我们称之为
    feature\u a
  • 提交到
    feature\u a
    分支,直到任务完成
  • 切换到本地
    development\u分行
  • 从原点向下拉任何新的更改(通常是经常发生的事情)
  • 功能\u a
    的更改合并到
    开发\u分支机构
  • development\u branch
    本地推送到源站
  • 为下一个任务创建新分支
现在一切正常,每个人都很高兴,但是,在下面的场景中,您希望更定期地拉车:

  • 克隆
    development\u分支机构
  • 为任务创建新分支(在本例中,我们称之为
    feature\b
  • 提交到
    功能\u b
    分支
  • 你意识到自己是一个拦截器,因此必须进行最新的更改
  • 切换到
    development\u分支机构
  • development\u分支机构
    origin拉入本地
  • 切换到
    功能\u b
  • development\u分支机构
    local合并到
    feature\u b
  • 继续工作直到完成
现在这看起来很安全,每个人都很高兴,但是我不确定我是否需要切换到
开发分支
,然后切换回并合并到我的本地功能分支。那么,我是不是在这里过于谨慎了,应该从
开发分支机构
开始,进入本地
功能分支机构

这似乎是可以做的,因为我所做的只是将更改直接带到我的本地功能分支中,而不更新我的本地
development\u分支
,然后如果我需要推动更改,我会再次切换、拉动、合并、推动

那么有人能确认这是否是一个好的做法吗

同样,由于这些特性分支只存在于每台开发人员的机器上,所以在没有太多问题的情况下,如果有人在做一半的任务,然后有人需要处理它,会发生什么情况?您可以将该分支推到原点,让他们将其取下,然后再进行处理,但这将需要进一步清理,因此我认为没有很好的方法来解决此问题,但我想听听其他人如何解决此问题,而不会远程创建过时功能分支的荒地



还有几件事要提,我们目前只是ffwd合并,所以尽管在引用的原始文章中没有提到ffwd合并,但我看不出在不创建大量远程分支的情况下如何做到这一点。我使用的是Tortoise GIT而不是命令行,但是这不会真正改变任何事情。

如果您想从另一个分支获得最新更新,可以跳过两个分支开关

git fetch
git merge origin/development_branch
至于你关于工作流程的问题,这完全是一个政策问题。我的工作地点使用项目分支,我们只是自己承担责任,明确规定它们的寿命。我们知道树枝何时生,何时死。这是使用
-d
标志删除分支的好处

git branch -d feature_branch

通过这样做(而不是使用
-D
),您可以确保分支已合并回主线。否则它会阻止你。因此,您可以非常自由地使用这个delete命令。

对我来说,使用GIT这样的分布式版本控制系统的主要原因之一是避免进入分支/合并地狱。就个人而言,听起来你的团队在做很多分支的工作,比如反对过早地、经常地向主线承诺。当然,在将更改推送到中央repo之前,我们还采用了持续部署和代码审查。git中的分支只是引用提交的轻量级指针。尽管通过将功能分支放在远程repo上,最终可能会得到很多功能分支,但这不会增加任何显著的开销。在特性合并到您的
开发分支
后,您确实可以删除并摆脱特性分支。另一种可接受的做法是,在同步时,使用重基在远程更改的基础上添加(未刷新的本地)更改,然后将新的重基更改推回,以避免在历史记录中出现额外的合并,并具有更线性的更改。@mike brant你是对的,我们迁移到git的原因之一是为了消除非分布式VCS的合并和分支噩梦。然而,随着分支和合并变得越来越容易,您就更容易更好地利用分支和合并。我几乎同意文章作者所说的一切,用他的方式(无论是对是错),这就是为什么我提倡用这种方式工作。我们实际上不需要代码审查,因为我们有一个环境构建脚本