【问题标题】:Are 2 branches identical if their final snapshot is identical but their commit path not?如果它们的最终快照相同但它们的提交路径不同,那么 2 个分支是否相同?
【发布时间】:2015-02-13 03:57:15
【问题描述】:

以下是一个假设场景,旨在更好地了解变基的危险

用户 A 进行了 2 次提交。他首先使用单词“Hello”将文本文件添加(暂存)到根目录,提交它,然后使用单词“world”将另一个文件添加到同一根目录,然后提交该文件。因此,他的最终提交对应于具有 2 个文件的根目录。一个只有一个单词“Hello”,另一个只有一个单词“World”

用户 B 做了同样的事情,并在他的 git root 项目中得到了相同的 2 个文件,只是他以相反的顺序执行:他首先添加带有单词“world”的文件,提交它,然后添加带有单词“hello”的文件并提交它。

最后,假设用户 A 将他的项目推送到远程存储库,然后用户 B 创建了一个跟踪分支并获取了用户 A 推送的项目作为分支。鉴于这种情况,我的问题——实际上试图模拟变基并磨练我对变基的危险的理解——是用户 B 是否需要与与用户 A 推送到远程的任何关联的分支合并仓库?

根据我的阅读和理解,用户 A 和用户 B 的 sha 哈希相对于他们的最终提交将是不同的,因此需要合并,假设他们都希望在知道他们是同步的情况下继续他们的“开发”工作.我说的对吗?

【问题讨论】:

  • 我不明白你的问题是如何模拟变基的
  • 假设您从公共远程克隆了 master 分支。此分支表示 2 个分支的合并。您在 master 上进行提交并尝试推送它;这样做后,您会意识到其他一些用户克隆了您所做的相同主分支,重新设置它的基础,然后执行 PUSH。因此,在其他用户的 PUSH 之后,假设没有添加进一步的 wirk,表示您克隆的最终快照相同,但提交顺序不同(即线性顺序)。我上面的问题与推送重新定位的分支后远程主分支的状况有关。
  • 它与您开始克隆的快照具有相同的快照。因此,您的额外工作(上述额外提交)不能只是一个快进提交,即使您的工作与您克隆时确实代表 master 的快照相关,并且因为它现在在远程中。您将需要与已经退出您想要 ti 推送的当前分支中的 COMMITS 进行合并,因为 git 不会通过快照比较分支,而是通过包含快照的哈希以及导致该快照的路径来比较分支
  • 当然,但是倒序的事情真的与它无关。如果他以相同的顺序进行更改,您将获得完全相同的结果。如果您在 5 分钟后自己重新提交,您将得到完全相同的结果。等等。
  • 通过以下 torek 的帐户,SHA-1 在这两种情况下是不同的——这就是我问的。你说得对,我们将有相同的最终结果,但是这两个最终结果将具有不同的哈希值来代表最终提交。如果我们的目标是同步我在这个线程顶部提到的 2 个分支,这将需要非快进合并。

标签: git rebasing


【解决方案1】:

您是对的,SHA-1 记录了路径(或多或少的整个祖先链),git 根据提交节点(带有原始 SHA-1 的 DAG)确定必须合并哪些提交.

如果他们真的合并(或者一个人将他的东西基于另一个人的东西,同时抛出任何“不需要的”提交),那么合并将变得很容易,因为 取决于文件内容——或者更具体地说,从合并基础到每个提示提交的差异。任何生成的合并提交(只要它被两个用户拾取)都会使他们的图表同步,因为新提交会将新的合并提交作为其父 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2020-03-05
    • 2019-10-24
    • 2015-07-14
    • 1970-01-01
    • 2022-01-20
    • 2011-01-03
    相关资源
    最近更新 更多