【问题标题】:git: Updating branches that depend on each othergit:更新相互依赖的分支
【发布时间】:2016-06-27 14:26:01
【问题描述】:

情况 我认为图片是更好的解释:

如您所见,我们有几个分支,其中大部分是solution-xyz-foo,用于不同的编号xyzsolution-12 基于 solution-11 等等。这条规则也有一些偏差,例如分支hystrix-dashboard-demo.

动机 分支中的代码供课程参与者在课堂式课程中使用。因此,参与者解决了练习,并在课程结束时得到类似于我们在solution-24 分支中提供的代码。 如果参与者被赶超或面临其他问题,他可以轻松地检查相应的分支并继续其余的练习。

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

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

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

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

除了涉及的实际工作之外,这是只有具有大量 git 经验的团队成员才有信心去做的事情。换句话说,那些没有那么自信的人会抱怨这个程序(我很清楚)。

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

问题 您能推荐任何可以解决以下问题的标签/分支/rebase/... 工作流程吗?

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

请注意,您可以假设在课程进行期间代码不会更改(因此参与者的计算机上不需要git remote update)。

【问题讨论】:

    标签: git version-control


    【解决方案1】:

    不要将每个“solution-xyz-foo”提交作为单独的分支访问,而是尝试将其作为链中搜索的祖先提交进行访问。

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

    然后'rebase --onto IMPROVED_COMMIT' 之后的结帐将根据 IMPROVED_COMMIT 生成分支

    git help revisions
    

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

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

    更新引用所有已更改提交的所有标签。请参阅“git help filter-branch”。再次,学生可以使用 'git checkout -b TAGNAME' 直接从标签名称中获取分支,并且可以使用历史记录。

    【讨论】:

    • 这是有希望的。我担心问题是参与者方面的可用性(Eclipse 中的 git)。我明天试试,谢谢!
    • 使用tag-name-filter 我只能更新已经存在的标签的名称,所以我必须添加更多filter-branch 魔法来做实际的变基。相反,我认为我很高兴首先做一个 rebase(在更改之上的最新提交),然后使用您在附加标签的答案中提到的修订技巧运行一个小脚本。
    【解决方案2】:

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

    【讨论】:

    • 你描述的就是我们先做的。当前的方法是只做一次变基(solution-24 在固定提交之上),然后将solution-23 附加到solution-24^solution-22solution-23^ 等。这就是帮助脚本所做的。问题是在 rebase 之后更新较低的分支。
    • 因此,如果您对解决方案-X 进行了错误修复,您可以对该提交进行更改,并可能使用原始解决方案-X 重新压缩该更改以获得解决方案-X 的提交。现在,一旦您将解决方案-(X+1) 重新设置为解决方案-X',所有解决方案-(X+N) 将获得您在第一步中添加的更改。所有解决方案-(X-N)(从解决方案-X 之前)可能都不需要修复,因此它们保持原样。如果不是,那么我显然不明白您要做什么,就这样吧。
    • 感谢您的关注!如果我在更新的解决方案 8 分支之上重新设置解决方案 9,则只有解决方案 9(当然还有解决方案 8)是正确的。解决方案 10 仍然指向与解决方案 9 和 8 对应的旧提交,但没有修复。因此,我还需要在 solution-8 (9, 10, ..., 24) 之后重新设置所有分支。编辑:如果您重复变基以增加 N 的值,您最终会得到几个较低解决方案提交的副本(每个变基出现一个)。这可以通过逐步变基来规避,总是在从底部开始的前一个分支上。
    • 啊,好的,抱歉,现在看看您遇到的问题。你真的想用变基移植一棵树。 stackoverflow.com/questions/5600659/… 有一些解决方案。虽然在最后,有人提到只使用合并来避免这种头痛。
    • 顺便说一句,你看过stackoverflow.com/questions/3150685/…吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多