【问题标题】:Git - How to recurringly squash merge to a master branchGit - 如何反复压缩合并到主分支
【发布时间】:2020-02-24 23:22:01
【问题描述】:

我有两个分支:

  1. 我每天提交几次的个人分支。
  2. 一个“开发”分支,我偶尔想将我的个人分支更改合并到该分支,但提交消息被压缩。

合并后,我想继续使用我的个人分支,然后可以随意重新合并回dev分支。

使用 svn,这很容易做到,不会发生任何合并冲突。

  1. 在个人分支上提交多项更改
  2. 将更改合并到 dev 分支,这将记录单个提交消息
  3. 将步骤 2 中的更改合并回个人分支,但“只记录合并信息”,这样它就不会合并任何内容。
  4. 重复步骤 1。

现在,dev 分支知道它从个人分支中获得了什么,而我的个人分支知道它拥有来自 master 分支的所有内容。

使用 git,我尝试使用 git merge --squash 从个人分支转到开发分支,第一次效果很好。但是第二次我遇到了一堆冲突。由于merge --squash 没有合并原始提交,而是进行了与原始提交无关的新提交,git 没有意识到我已经将一堆内容从我的个人分支合并到了开发分支。

在 git 中这个工作流程有什么解决方案吗?看来如果我merge --squash一个分支,下次我必须创建一个新分支。

【问题讨论】:

    标签: git svn


    【解决方案1】:

    git merge --squash 之后,不应使用分支进行进一步合并。

    如果你坚持使用 squash 合并,你可以使用这个流程:

    git checkout dev
    git merge --squash personal
    git tag personal_1_0 personal  #optional to save old personal branch
    git checkout -B personal
    

    实际上,您从当前开发人员创建了一个新的个人分支,稍后您可以从它压缩合并。每次压缩合并时都执行此操作(每次使用不同的标签)。

    【讨论】:

      【解决方案2】:

      首先要了解的是,您描述所需行为的方式(合并到目标记录仅 1 次提交)正是默认合并的工作方式。

      看起来不是这样的原因是,许多 git 命令默认情况下会跟随所有进入合并的分支。您可以通过为命令提供--first-parent 选项来更改它

      git log --first-parent
      

      常规合并和“压缩合并”都准确记录一个新提交并将其放置在目标分支上(即,当您发出命令时,分支已签出)。

      不同之处在于 squash 合并假装他们没有编写合并 - 也就是说,新提交的 only 父级是目标分支的先前提示。正常的合并有第二个父级 - 无论您合并到哪个分支 - 正如您所注意到的,如果您希望后续合并正常工作,则需要它。

      您可以跳过铁环重新发明轮子。例如,eftshift0 为您提供了一种方法,可以随时使 dev 与您的其他分支的尖端相匹配 - 这有点像合并而不考虑合并基础,只要您的分支之外别无他处对 @ 有贡献987654324@。如果您搜索 SO,您甚至可以找到更通用的解决方案。

      但所有这些解决方案的共同点是,它们都与 git 的工作方式背道而驰。按预期使用 git 确实要容易得多 - 即,当您想要进行这些更改时,只需将您的分支合并到 dev 中,如果您想要不遵循侧分支的输出,请使用 first-parent

      【讨论】:

        【解决方案3】:

        您希望压缩的修订版支持开发吗?就像,一个又一个壁球修订?如果是这种情况,您可以这样做:

        git checkout --detach my-branch
        git reset --soft the-previous-squash-commit
        git commit -m "A new squash operation that covers revisions x, y and z"
        git checkout dev
        git merge -m "Merging a new squash commit" HEAD@{1} # given that I didn't have a branch set up for the squashed revision
        

        我认为那里不应该有任何冲突。

        【讨论】:

        • 好的,谢谢,我知道这将如何让我将更多更改带回 dev 分支。但是如何将 dev 分支的更改带回我的个人分支呢?
        • 其实这个好像还是会有冲突的。目前,我已使用压缩提交将一组更改合并到 dev 分支。但是我正在尝试合并/压缩另一组对 dev 分支的更改,但 dev 分支不知道它从我的分支中获得了第一组压缩更改。我想不出任何办法。
        猜你喜欢
        • 2016-07-16
        • 2018-11-29
        • 2012-12-18
        • 2017-02-26
        • 2020-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        相关资源
        最近更新 更多