【问题标题】:Managing changes from develop branch into feature prior to push (git)在推送之前管理从开发分支到功能的更改(git)
【发布时间】:2021-08-28 00:05:52
【问题描述】:

我过去工作过的大多数团队在使用 Git 时都遵循相同的工作流程(有一些微小的变化):

  1. 拉取develop分支(git checkout develop)
  2. 创建一个新的功能分支 (git checkout -b feature/XYZ-123)
  3. 做好你的工作
  4. 当您准备好创建 PR 时,添加并提交您的更改 (git add . && git commit -m "some commit message"),然后检查 develop 退出,拉取它 (git checkout develop && git pull)
  5. 切换回您的功能分支并将develop 合并到其中 (git checkout feature/XYZ-123 && git merge develop)
  6. 最后推送 (git push -u origin feature/XYZ-123) 并创建 PR

我们将其称为“合并方法”。好处是自从您创建分支以来对develop 的任何更改现在都合并到您的分支中。因此,当您创建 PR 时,与 develop 没有合并冲突,并且代码审查者可以看到您的分支与 develop 之间的干净、无冲突的差异。

我现在正在一个团队工作,该团队在合并步骤之前具有类似的流程,但是他们没有将 develop 合并到我的功能分支中,而是要求从 origin/develop 进行变基。所以实际的步骤是:

  1. git checkout develop
  2. git checkout -b feature/XYZ-123
  3. 做好你的工作
  4. git add . && git commit -m "some commit message"
  5. git checkout develop && git pull
  6. git checkout feature/XYZ-123
  7. origin/dev变基
  8. git push -u origin feature/XYZ-123

我们将其称为“变基方法”。它也产生了无合并冲突的 PR,但显然它与上面解释的合并方法有不同的优点/缺点。

我想知道这些优点/缺点是什么。 Merge 方法使 Rebase 方法缺乏什么,反之亦然?什么时候应该使用一种方法而不是另一种方法?

【问题讨论】:

    标签: git github merge git-flow


    【解决方案1】:

    但显然它与上面解释的合并方法有不同的优点/缺点

    不是真的。在反向合并(我称之为)和 rebase 之间,最终的效果完全相同,即尝试从develop 中获取所有最近的更改,以便(1)可以准确地测试功能分支和( 2) 减少合并到develop 时发生合并冲突的可能性。

    反向合并和变基之间的主要明显区别是功能分支上缺少额外的合并提交。这使得 rebase 很有吸引力。所以:

    • 变基在历史上看起来要干净得多,因为您似乎是从更近的 develop 状态开始分支的。

    但这里有一些反诉:

    • 如果有即将到来的冲突,变基会使解决这些冲突变得更加困难。

    • 在推送形成拉取请求后你不能变基,因为这会重写共享历史;而您可以随时反向合并。

    我个人两个都用!我在初始推送之前 rebase 以形成拉取请求;如果拉取请求存在很长时间,我会定期反向合并,尤其是在实际批准和合并之前。

    【讨论】:

    • 谢谢@matt (+1) -- 如果你不介意,我还有一些后续问题! (1) Reverse Merge 方法是否总是产生所谓的“squash commits”,如果没有,那是什么? (2) 为什么你认为变基使得解决合并冲突变得更加困难?而 (3) 当你说“在推送形成拉取请求后你不能变基,因为这会重写共享历史”,你可以扩展它的任何机会稍远一点?也许举个例子?我想我不确定您所说的“共享历史”是什么意思!再次感谢!
    • Squash 合并与本次讨论完全正交,我不打算深入讨论。变基使得合并冲突更难解决,因为它们可能出现在变基中间的不同阶段(提交),并且可能不清楚如何处理它们,因为有更多的提交即将到来。共享历史记录是您推送的任何其他人可能已获取的内容;你将不得不使用force 来推送已经推送的分支的变基版本,这是一种恶臭,应该警告你,因为你可能会破坏其他人与数据的关系。
    • 非常感谢您的回答,但是您每句话都包含了很多信息,我觉得我可以在这里为您的每个句子问 10 个问题!我保证这是我的最后一组跟进,只是为了锁定我的高级理解。
    • 我不能完全理解变基实际上是什么。你听起来好像变基正在“重播”来自develop 分支的所有更改。如果那是真的,那么我认为你所说的一个例子是:(i)我启动 rebase 并且有 10 个从 develop 提交到合并,(ii)在 Commit #4 (满分 10 分)存在冲突,我将其合并,(iii)在 Commit #8 处还有另一个冲突,但由于我之前在 Commit 4 处合并冲突的方式,在 Commit #8 处手动合并变得更加困难和混乱。这是你的意思的一个例子吗?
    • 第二,关于重写共享历史的东西,听起来你好像在说如果我尝试变基并强制推送我的分支我创建了 PR,然后:(i) 我推送这些更改,(ii) 另一个开发人员可能在 PR 仍在等待审查时错误地将它们合并到 develop,(iii) 代码审查发生并且请求进行小的更改,(iv) 我在我的分支中进行这些更改,然后我在推送它们之前 rebase,(v) 因为develop 现在错误地在其中包含了我以前的提交,rebase 现在正在重播我之前在我自己的分支上的提交,这可能会导致问题......跨度>
    猜你喜欢
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2021-09-17
    • 2020-12-22
    相关资源
    最近更新 更多