代码之家  ›  专栏  ›  技术社区  ›  NeoZoom.lua

Git工作流二:将1个PR拆分为2个PR

git
  •  0
  • NeoZoom.lua  · 技术社区  · 4 年前

    我遇到了一种情况,我想知道什么是专业的解决方法。场景是这样的:(PR=Pull请求)

    1. 我有一个公关,大约有2000多行代码。
    2. 为了便于复习,我必须把它分成两部分:1300多行 A ,以及700多条被称为 B .

    下面是我观察到的问题:

    1. 在审查 A. ,我很有可能需要改变 A. 自从 B 依赖于 A. ,会有很多冲突 A. 之后 A. 被重构并合并到 master 树枝
    2. 我需要在这方面取得进展 B 什么时候 A. 正在审查中,但在 B 我可能需要重新进行重构 A. .

    那么在这种情况下最好的做法是什么呢。

    1 回复  |  直到 4 年前
        1
  •  3
  •   Stanislav Bashkyrtsev    4 年前

    说到最佳实践。。如果你想用最简单的方法来解决这个问题:

    1. 而不是创造 A B PRs-创建公正的 A. .它应该尽可能小,以便尽快得到审查。
    2. 其余的更改——要么隐藏它们,要么将它们提交到单独的临时分支中。 不要同时处理它们 .你的目标是让你的第一个公关尽可能快地进入后备箱。
    3. 最后把它塞进后备箱。尽一切可能加快审查。
    4. 在它进入后备箱后,将其与隐藏的更改合并。自从 A. 它(希望)很小——不应该导致太多冲突。
    5. 转到#1并为下一部分创建PR。

    整个过程可能会导致多次提交。多做点小事总比少做点大事好。

        2
  •  1
  •   TTT    4 年前

    总的来说,我建议尽可能避免这种情况。 (这基本上就是斯坦尼斯拉夫的答案所建议的,我也同意。)有时,这意味着等待和工作的其他东西,直到公关为您服务 A 完成了。几乎总是有一些你不依赖的东西可以做 A. .

    但如果等待是不现实的:

    一旦新的和改进的“A”被合并到 master ,对您的 B 分支机构:

    1. 通过隐藏、撤消或提交任何挂起的更改来获得干净的状态。
    2. git checkout B # if not already
    3. git fetch # this should be obvious but you'd be surprised how often it's forgotten
    4. git rebase --onto origin/master A B # resolve any conflicts you have

    为什么会这样:

    “花式”的再基与 --onto 参数使您能够“重建”或“重写”分支,就像您从 主人 首先。这基本上与:

    git checkout B
    git reset --hard origin/master
    git cherry-pick A..B # cherry pick this range of commits
    

    所以,让 B 看起来就像 origin/master . 现在重播你的每一次提交 B 那不是你本地的 A. .请注意,如果您没有 A. ,您不想使用 origin/A 在这里,因为自从您创建了 B 树枝在这种情况下,您可以在两个 rebase cherry-pick 命令。代替 A. 父母亲 你想保留并替换的第一个承诺 B 最后一次你想要保持的承诺。如果你使用 rebase --onto 使用提交ID,您可能会以分离模式结束。那样的话你可以回去 B 通过做 git switch -C B 这将迫使您在当前提交时返回B分支。

    请注意,如果您与rebase有很多冲突,并且对此有点不舒服,那么您可能希望中止rebase,然后创建一个新的分支和樱桃采摘。这使得比较旧分支和新分支更容易。如果你走这条路,那么只需将新的临时分支重命名为 B 当你完成后,或者只是把新的分支公关到 主人 而不是 B .