Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Git的重基不像DARC那样需要指数级的时间?_Git_Git Merge_Rebase_Darcs - Fatal编程技术网

为什么Git的重基不像DARC那样需要指数级的时间?

为什么Git的重基不像DARC那样需要指数级的时间?,git,git-merge,rebase,darcs,Git,Git Merge,Rebase,Darcs,因此,根据维基百科关于版本控制中合并的页面,DARC使用补丁交换,Git也使用补丁交换 我很好奇为什么Git rebase在某些情况下不像DARC那样需要指数级的时间 页面列出了DARC何时可能发生的一系列案例,以及如何尝试和解决这些问题 我没有使用DARC,在这里可能会偏离基准,但通过浏览维基百科的文章,我发现它在这里的说法具有误导性: 补丁交换在DARC中用于合并更改,也在git中实现,但称为重定基址。面片交换合并意味着改变面片的顺序,即改变的描述,从而形成线性历史。实际上,当两个补丁在一种

因此,根据维基百科关于版本控制中合并的页面,DARC使用补丁交换,Git也使用补丁交换

我很好奇为什么Git rebase在某些情况下不像DARC那样需要指数级的时间


页面列出了DARC何时可能发生的一系列案例,以及如何尝试和解决这些问题

我没有使用DARC,在这里可能会偏离基准,但通过浏览维基百科的文章,我发现它在这里的说法具有误导性:

补丁交换在DARC中用于合并更改,也在git中实现,但称为重定基址。面片交换合并意味着改变面片的顺序,即改变的描述,从而形成线性历史。实际上,当两个补丁在一种常见情况下生成时,在合并时,其中一个补丁会被重写,以便看起来是在另一个补丁的上下文中生成的

Git既不存储补丁,也不重新排序补丁。1如果愿意,您可以手动重新排序补丁。当您使用git rebase将快照提交转换为变更集时,转换本身以一种简单的方式完成,其中n是行数,d是编辑脚本的长度。这是作为补丁处理,还是作为合并处理,取决于您选择的重基算法;合并案例倾向于使用更多的CPU时间,因为它还查找树域重命名操作

因此,如果您有C total提交,git rebase-i的最坏情况大约是OCnd。2 git不会尝试任何其他提交顺序:由您来执行任何重新排序。如果您的重新基址失败,您可以尝试所有可能的重新排序,这将是提交数量的阶乘函数,但Git不会为您这样做

1如果在一组提交上执行git重基,而提交本身内部有一个或多个合并,git会将它们展平并消除合并,但它不会尝试许多顺序,它只会对整个过程执行一次拓扑行走。没有人试图聪明一点,这通常会导致可怕的合并冲突,也就是说,这通常是个坏主意。如果您使用new-rebase merges标志,Git将尝试保留合并,但通过重新执行合并来实现。它只是使用迷你脚本语言构建了一个相同的拓扑,然后允许您手动编辑它


2如果涉及到重命名检测,则可以检测到的文件数为2。Git试图通过几种方式来限制这一点,包括重命名队列的最大长度,当前默认值为4000个文件。

我没有使用DARC,可能在这里有偏差,但通过浏览Wikipedia文章,我发现它在这里的声明具有误导性:

补丁交换在DARC中用于合并更改,也在git中实现,但称为重定基址。面片交换合并意味着改变面片的顺序,即改变的描述,从而形成线性历史。实际上,当两个补丁在一种常见情况下生成时,在合并时,其中一个补丁会被重写,以便看起来是在另一个补丁的上下文中生成的

Git既不存储补丁,也不重新排序补丁。1如果愿意,您可以手动重新排序补丁。当您使用git rebase将快照提交转换为变更集时,转换本身以一种简单的方式完成,其中n是行数,d是编辑脚本的长度。这是作为补丁处理,还是作为合并处理,取决于您选择的重基算法;合并案例倾向于使用更多的CPU时间,因为它还查找树域重命名操作

因此,如果您有C total提交,git rebase-i的最坏情况大约是OCnd。2 git不会尝试任何其他提交顺序:由您来执行任何重新排序。如果您的重新基址失败,您可以尝试所有可能的重新排序,这将是提交数量的阶乘函数,但Git不会为您这样做

1如果在一组提交上执行git重基,而提交本身内部有一个或多个合并,git会将它们展平并消除合并,但它不会尝试许多顺序,它只会对整个过程执行一次拓扑行走。没有人试图聪明一点,这通常会导致可怕的合并冲突,也就是说,这通常是个坏主意。如果您使用new-rebase merges标志,Git将尝试保留合并,但通过重新执行合并来实现。它只是使用迷你脚本语言构建了一个相同的拓扑,然后允许您手动编辑它


2如果涉及到重命名检测,则可以检测到的文件数为2。Git试图通过几种方式限制这一点,包括重命名队列的最大长度,当前默认值为4000个文件。

您可以在我回忆的一个示例中看到发生了什么 某处:从六行A B C D E F开始,在一个分支上,在前面插入三行G G,然后在前面再插入六行A B C D E F;在从第一个补丁/提交更改C到C4的另一个分支上。现在合并这两个分支

Git将生产B C4 D E F G A B C D E F;DARC将改变第二个C,前提是其身份跟踪比Git的上下文和位置跟踪产生更好的结果。如果4是块的初始化代码,则Git的结果是错误的;如果是函数或文件的初始化代码,则darcs是错误的


你可以在我从某处回忆起的一个例子中看到发生了什么:从六行A B C D E F开始,在一个分支上在前面插入三行G G G G,然后在前面再插入六行A B C D E F;在从第一个补丁/提交更改C到C4的另一个分支上。现在合并这两个分支

Git将生产B C4 D E F G A B C D E F;DARC将改变第二个C,前提是其身份跟踪比Git的上下文和位置跟踪产生更好的结果。如果4是块的初始化代码,则Git的结果是错误的;如果是函数或文件的初始化代码,则darcs是错误的


身份跟踪占用了时间。

我理解身份部分,但我没有得到你最后两个例子说明4是否是…没有风投公司能够可靠地回答的问题是,更改是否正确地属于文件中的第一个abcdef块,还是明显被逐步推掉的块再往下走。DARC花费了大量的精力和cpu计算错误猜测的正确结果。Git的猜测并没有更好,但它得到答案的速度要快得多。当然,两个风投都错过的另一种可能性是,两个区块都应该进行相同的更改。我自己启发的问题是:这意味着DARC的合并操作检查从合并基到两个分支提示的每个提交?我认为Git这样做可能是合理的,特别是在操作员控制下查找文件重命名,因为它的cpu非常昂贵。@torek确实如此。GitHub上的GitImerge可以进行增量合并,我想这样就可以了。但我不认为任何自动过程在这里都是完全可信的,合并代码总是需要判断,即了解自动合并将产生什么,以及人工决定此合并的正确结果。想一想所有可能的变化都应该改变这两种情况。我理解身份部分,但我没有得到你最后两个例子说明4是否是…没有风投能够可靠地回答的问题是,改变是否正确地属于文件中的第一个abcdef块,还是属于显然已经被改变的块他们被推得更远了。DARC花费了大量的精力和cpu计算错误猜测的正确结果。Git的猜测并没有更好,但它得到答案的速度要快得多。当然,两个风投都错过的另一种可能性是,两个区块都应该进行相同的更改。我自己启发的问题是:这意味着DARC的合并操作检查从合并基到两个分支提示的每个提交?我认为Git这样做可能是合理的,特别是在操作员控制下查找文件重命名,因为它的cpu非常昂贵。@torek确实如此。GitHub上的GitImerge可以进行增量合并,我想这样就可以了。但我不认为任何自动过程在这里都是完全可信的,合并代码总是需要判断,即了解自动合并将产生什么,以及人工决定此合并的正确结果。想一想所有可能的变化都应该改变这两种情况。我想我理解你的意思,但只是再检查一下,你所说的d是指编辑脚本的长度。什么是编辑脚本?另外,如果说作为补丁交付,您的意思是只是一个没有重命名分辨率的正常重基?1 git diff的输出或任何解决方案的输出是一个编辑脚本,包含像在位置17插入I和在位置30删除D项这样的操作。此编辑脚本的长度为d,输入本身的长度为n。2是的,这是完全正确的:git rebase不带-i或-m或其他各种选项,使git运行git格式的修补程序,并将生成的修补程序集提供给git am。我想我理解您的意思,但请仔细检查一下,d是指编辑脚本的长度。什么是编辑脚本?另外,如果说作为补丁交付,您的意思是只是一个没有重命名分辨率的正常重基?1 git diff的输出或任何解决方案的输出是一个编辑脚本,包含像在位置17插入I和在位置30删除D项这样的操作。此编辑脚本的长度为d,输入本身的长度为n。2是的,完全正确: git rebase不带-i或-m或其他各种选项,使git运行git格式的修补程序,并将生成的修补程序集提供给git am。