git:更新彼此依赖的分支

时间:2016-06-27 14:26:01

标签: git version-control

场合 我认为一张图片是一个更好的解释:

enter image description here

正如您所看到的,我们有几个分支,其中大部分solution-xyz-foo代表不同的数字xyzsolution-12建立在solution-11之上,依此类推。此规则也存在一些偏差,例如:分支hystrix-dashboard-demo

动机 分支中的代码由课堂风格课程中的课程参与者使用。因此,参与者解决练习,并在课程结束时,最终得到类似于我们在solution-24分支中提供的代码。 如果参与者超出或面临其他问题,他可以轻松签出相应的分支并继续进行其余的练习。

此外,可以查看每个练习的解决方案,这些解决方案作为单个提交提供。

换句话说,对于课程参与者而言,彼此之间建立的分支机构/解决方案具有我们希望保留的巨大优势(这是建立在目前为止举办的多门课程的反馈基础上)。

作为课程的开发者(准备练习和解决方案,向参与者展示内容等),我们需要不时更新部分代码。例如,我们可能希望修复solution-3中的问题。为了使此修复在solution-4等中可见,我们需要合并/ rebase / cherry-选择包含修复的提交。为了避免巨大的混乱,我们决定将每个解决方案的所有更新压缩到一个提交中,然后使用一些rebase重新构建图片中显示的稍微线性的结构。

问题 正如您可能已经猜到的那样,进行重组是很多工作。即使有一个帮助脚本(在rebase之后将分支重新附加到提交,但是在新的/更改的分支名称的情况下需要维护)我们仍然需要执行rebase,修复冲突,重新附加分支,并将更改推回存储库(使用强制推送)。

除了涉及的实际工作之外,只有具有大量git经验的团队成员才有信心。换句话说,那些不那么自信的人抱怨程序(我清楚地理解)。

作为旁注,我们失去了git的明显优势:没有变更历史(旧版本丢失)。此外,开发人员需要协作并传达对代码的更改。

问题 你能推荐一个解决以下问题的标签/分支/ rebase / ...工作流程吗?

  • 课程参与者可以轻松查看他们目前正在进行的练习的最新解决方案(编辑:目前,在Eclipse中使用鼠标执行此操作是首选方式)
  • 每个练习的解决方案以方便的方式提供(即单个提交)
  • 开发人员可以轻松地将修复程序和更新集成到各个解决方案中,以便后面的解决方案也可以相应更新
  • [可选]保留更改历史记录

作为一个注释,您可以假设在课程进行过程中代码不会改变(因此参与者的计算机上不需要git remote update。)

2 个答案:

答案 0 :(得分:1)

而不是访问每个'解决方案-xyz-foo'作为单独的分支提交,尝试将其作为链中的搜索祖先提交进行访问。

git checkout -b MyWorkingBranch remotes/origin/LAST_COMMIT_IN_COURSE^\{/solution-xyz\}

然后在< rebase --to IMPROVED_COMMIT'之后结账。将根据IMPROVED_COMMIT

生成分支

git help revisions

如果您使用标签而不是分支,则可以使用

git filter-branch --tag-name-filter <rename command>

更新引用所有已更改提交的所有标记。请参阅git help filter-branch&#39;。同样,学生可以使用&#39; git checkout -b TAGNAME&#39;直接从标签名称获取分支。并且可以获得历史。

答案 1 :(得分:0)

所以这听起来像链中间的一个外科变基,用于修复一些提交,然后是(之前)提交后的另一个变更 - 新修复的提交。所以我对评论感到困惑“......即使有一个帮助脚本(在rebase之后重新将分支附加到提交,但是在新的/更改的分支名称的情况下需要维护)...”。这似乎(可能)像rebase一样简单 - 更新你的更新提交,所以不需要为新的/更改的分支名称维护它 - 所有这些东西都是通过rebase进行的,不是吗?