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

樱桃采摘问题

  •  0
  • mira_mayhem  · 技术社区  · 10 年前

    分支和提交

    mb: A -> B -> C -> G -> H -> I
                   \
    db:             -> D -> E -> F
    

    在db(开发分支)和mb(主)上都有进展。 回扣是我通常做的事。事实上,总是这样。但是,当使用“F”时,不可能对mb重新设置基音(太多奇怪的冲突)。 解决方案:樱桃采摘!

    我从“”创建了一个新分支 兆字节 -我们称之为“nmb”(新的主分支) 在这个分支中,我从“ 数据库 。(这是一个简单的解决方法,因为“db”中的提交比“mb”中的少)

    此时,我没有分析git日志,这可能会让我的生活更轻松。 所有文件都已到位,应用程序按预期工作,因此我继续工作。。。

    现在,完全相同的场景正在重复。

    我无法将“nmb”与“mb”重新组合,日志看起来很尴尬:

    F' 10/6 -14 12:23:43
    E' 10/6 -14 10:03:30
    D' 10/6 -14 09:54:10
    I  ...
    H  ...
    G  ...
    F  10/6 -14 12:23:43
    E  10/6 -14 10:03:30
    D  10/6 -14 09:54:10
    C  ...
    B  ...
    etc
    

    D’和D,E’以及E,F’和F共享相同的日期/时间、消息和文件,但提交散列不同。

    这是樱桃采摘的结果吗?一次提交原件,一次提交樱桃?

    git日志是否显示正确的数据?

    我真的迷失在吉特兰。

    我应该补充一下,我是一个新手,对gits的所有功能都不太熟悉。这对我来说可能是一个巨大的失误,最简单的办法就是将文件保存到其他地方,然后重新开始。。。

    1 回复  |  直到 10 年前
        1
  •  1
  •   torek    10 年前

    这是樱桃采摘的结果吗?一次提交原件,一次提交樱桃?

    是的:这就是摘樱桃的工作原理;它复制命令,复制消息和时间戳,也就是说。它还进行与原始消息相同的更改。当你在 nmb 并且做到了 git cherry-pick D ,git基本上做到了 git show D 看看你做了什么,应用了相同的更改,并进行了新的提交 D' ,正在离开 D 围绕

    git日志是否显示正确的数据?

    假设你让它给你展示几个分支,是的。


    回扣是我通常做的事。

    所有的“重新基础”是,樱桃选择类固醇(就像它一样),然后是一个更多的技巧。

    让我们用相反方向的箭头重新绘制第一张图片,因为这就是它们的工作方式:一个分支指向最前端的提交,每个提交都指向其父级。(因此,合并只是指向至少两个父级的提交。)Git必须这样做,因为所有提交都是永久的 1. 如果你试图改变任何事情,你会得到一个新的、不同的承诺。

    A <- B <- C - G - H - I   <-- mb
                \
                  D - E - F   <-- db
    

    (我不再纠结于箭头的方向 C ,但基本上是向左的。)

    如果您想重新设置基准 db mb ,您可以告诉git:

    git checkout db
    git rebase mb
    

    什么 rebase 查找您当前的分支机构( 数据库 )与目标分支连接( 兆字节 ),在这种情况下,接受之后的所有提交, D , E F 樱桃采摘它们。为了进行樱桃采摘,它制作了一个新的树枝,它实际上使用了一个匿名的树枝,但我们姑且称之为 tmp 然后执行 git cherry-pick 命令。如果一切顺利,结果是:

                              D'- E'- F'  <-- tmp
                            /
    A <- B <- C - G - H - I   <-- mb
                \
                  D - E - F   <-- db
    

    之后git只需删除旧的 数据库 标签和粘贴 数据库 在上 临时存储器 标签:

                              D'- E'- F'  <-- db
                            /
    A <- B <- C - G - H - I   <-- mb
                \
                  D - E - F   <-- [old db, now abandoned]
    

    大多数git命令不会显示旧的、废弃的提交,但由于它们是半永久的, 1. 他们还在里面。


    1. 提交(以及实际上存储库中的任何其他对象)永远存在 只要他们“可到达” 通过提交图。指向分支尖端的分支名称使特定提交可访问。由于每个提交都带有其父ID,因此这些提交也可以访问,它们的父ID也可以访问 未标记的 无法访问的对象。

    当git更新一个分支时,它通常会保存一个“分支指向何处”的日志。这些引用日志(简称“reflog”)在保持提交可访问性方面很重要,但是 git log 忽略它们,除非你告诉它使用reflog( git log -g ).

    每个reflog条目都有一个创建时间戳。默认情况下,reflog条目将在30到90天后过期。一旦reflog条目消失,这些提交就变成真正的未引用,然后 git gc 将最终删除它们。