Git 如果两个分支的最终快照相同,但提交路径不同,那么它们是否相同?

Git 如果两个分支的最终快照相同,但提交路径不同,那么它们是否相同?,git,rebasing,Git,Rebasing,以下是一个假设场景,旨在更好地了解重定基期的危险 用户A进行2次提交。他首先向根目录添加(stage)一个文本文件,其中包含单词“Hello”,然后提交它,然后向同一根目录添加另一个文件,其中包含单词“world”,然后提交该文件。因此,他的最终提交对应于一个包含2个文件的根目录。一个只有一个单词“你好”,另一个只有一个单词“世界” 用户B在他的git根项目中做了同样的事情,并最终得到了相同的2个文件,只是他按相反的顺序做了:他首先添加带有单词“world”的文件,提交它,然后添加带有单词“he

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

用户A进行2次提交。他首先向根目录添加(stage)一个文本文件,其中包含单词“Hello”,然后提交它,然后向同一根目录添加另一个文件,其中包含单词“world”,然后提交该文件。因此,他的最终提交对应于一个包含2个文件的根目录。一个只有一个单词“你好”,另一个只有一个单词“世界”

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

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


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

你说得对,SHA-1记录路径(整个祖先链,或多或少),git根据提交节点(DAG及其原始SHA-1)确定必须合并哪些提交


如果他们真的合并(或者一方在另一方的基础上重定其内容,同时抛出任何“不必要的”提交),那么合并将变得很容易,因为这取决于文件内容,或者更具体地说,取决于从合并基础到每个提示提交的差异。任何结果合并提交(只要两个用户都接收到)都将使它们的图形同步,因为新提交将把新合并提交作为它们的父ID。

我无法理解您的问题是如何模拟Singlet的假设您从公共远程克隆了主分支的。此分支表示两个分支的合并。您在主控台上执行提交并尝试推送它;这样做后,您会发现其他用户克隆了与您相同的主分支,重新设置了它的基础,然后进行了预推。因此,在另一个用户推送之后,假设没有添加进一步的wirk,则表示您克隆的相同最终快照,但提交顺序不同(即线性顺序)。我上面的问题与推送重基分支后远程上的主分支的状况有关。它的快照与您刚开始克隆的快照相同。因此,您的附加工作(前面提到的附加提交)不能仅仅是一个快进提交,即使您的工作涉及到一个快照,该快照确实代表了您当时克隆的主机以及现在在远程中的主机。您将需要执行与提交的合并,这些提交已经存在于您希望ti push的当前分支中,因为git不通过它们的快照来比较分支,而是通过包含快照以及指向快照的路径的散列来比较分支。当然,相反的顺序实际上与之无关。如果他按照同样的顺序进行修改,你会得到完全相同的结果。如果5分钟后自己重拨提交,则会得到完全相同的结果。根据torek下面的描述,SHA-1在这两种情况下是不同的——这就是我所问的。你说的对,我们将有相同的最终结果,但这两个最终结果将有不同的哈希表示最终提交。如果我们想同步我在这个线程顶部遇到的两个分支,那就需要进行非快进合并。