代码之家  ›  专栏  ›  技术社区  ›  lost9123193

用git rebase修复合并冲突并导出

  •  0
  • lost9123193  · 技术社区  · 6 年前

    我遇到了一些与git rebase的合并冲突。

    我的问题是,如果我解决了冲突,我是否应该这样做:

    git add files
    git commit "fixed merge conflicts"
    

    然后继续

    git rebase --continue
    

    我的另一个问题是如果我搞砸了,我能不能

    git rebase --abort 
    

    这会消除所有的犯罪吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   torek    6 年前

    基于 your comment jready's answer ,真正的问题是是否应该在某处/以某种方式保存原始提交链。

    在某种基本级别上,rebase是通过复制来工作的(因为提交永远不能更改这包括它们的向后链接)。分支名称只是指向一些特定的提交。如果我们将提交绘制为图中的节点,我们得到的结果如下:

    ...--F--G--H--I   <-- origin/whatever
             \
              J--K--L   <-- your-branch
    

    如果你跑 git checkout your-branch && git rebase origin/whatever Git必须 复制 犯罪 J ,将其转换为相对于其父级的一组更改 G ,并应用这些更改以提交 I (何处) origin/whatever 点)。复制的 J J' ,然后尝试复制 K 作出新的承诺 K' ,等等。最终的结果是,在解决任何冲突之后,在git“剥离名称”commit之前 L 是:

                    J'-K'-L'  <-- HEAD
                   /
    ...--F--G--H--I   <-- origin/whatever
             \
              J--K--L   <-- your-branch
    

    最后一步 git rebase 是删除名称 your-branch 从现在粘贴的位置,指向提交 L ,并指出 L' Rebase制作的最后一个副本:

                    J'-K'-L'  <-- your-branch (HEAD)
                   /
    ...--F--G--H--I   <-- origin/whatever
             \
              J--K--L   [abandoned]
    

    如果你使用 git rebase --abort git没有继续,而是放弃了复制的链,留下了名称 你的分支 仍然指向 L :

                    J'-K'-L'  [abandoned]
                   /
    ...--F--G--H--I   <-- origin/whatever
             \
              J--K--L   <-- your-branch (HEAD)
    

    在你开始重新定位之前,或者在重新定位中间的任何时候 你的分支 仍需提交 L ,可以添加新名称以记住commit的原始哈希ID L :

                    J'-K'  <-- HEAD
                   /
    ...--F--G--H--I   <-- origin/whatever
             \
              J--K--L   <-- your-branch, extra-name
    

    你可以用它 git branch extra-name your-branch 例如。这样,在你完成回扣后,假设你完成了它,你会得到:

                    J'-K'-L'  <-- your-branch (HEAD)
                   /
    ...--F--G--H--I   <-- origin/whatever
             \
              J--K--L   <-- extra-name
    

    你不 这么做,因为秘密的, GIT重碱 设置一个特殊的名称, ORIG_HEAD ,以记住你的分支名称在被扯下之前在哪里 L 贴在上面 L’ . 但名字 始祖鸟 将被稍后使用的其他git命令(可能是另一个rebase)覆盖,该命令会像这样到处拉扯标签,因此这是一种短期的权宜之计,如果您不喜欢结果,可以使用它来恢复。

    你的git还记录了 重新浮起 对于分支,分支名称的前一个值,即 你的分支 用于指向提交 L 而不是 L’ . 这些重新登录条目持续30或90天。 它们不是最容易使用的东西,不过:

    git reflog your-branch
    

    会溢出所有这些,但您得到的是在每次提交中使用的单行摘要,以及当您使用 GIT重碱 通常从commit复制原始的单行摘要 L 提交 L’ ,所以很难分辨哪一个是哪一个。

    尽管如此 始祖鸟 而重新登录通常会让你恢复没有额外的名字。如果能让你更舒服的话,就用这个额外的名字。我经常这么做:如果我在工作 feature/X ,需要重新定位,我创建 feature/X.0 然后再重新定位。我最初的提交系列现在可以作为dot zero版本使用。几天后,如果我需要再做一次调整,我会创建 feature/X.1 然后再重新定位。所以 特征/X 是最新的,而且 feature/X.<number> 是老的,还有更多的老的,直到我自己把它们捡起来扔掉。


    从技术上讲,30天内到期的是使用 expireUnreachable 时间:这些承诺不是 可达成的 从引用的当前值。rebase通常会进行这种引用,因此默认的30天到期日是您应该关注的到期日。

    (重新记录 可获得90天的默认值。)

        2
  •  0
  •   jaredready    6 年前

    git rebase --abort 将完全退出rebase,基本上是将存储库恢复到启动 rebase . 唯一丢失的承诺将是全新的承诺 git rebase 创造了 GIT重碱 重放 您的原始提交,从而形成新的提交)。

    无论是否中止,都不会触及原始提交。