2016-04-29 126 views

回答

5

也就是说,其实是一个非常好的问题,因为提交快照。

底垫原因的工作原理是因为底垫实际上是重复git cherry-pick(有位在前面包裹的找出该选择什么样的,多在年底移动分支标签),并git cherry-pick作品转动承诺变更集

假设,例如,你有提交的序列:

  A--B--C <-- topic 
     /
...--o--*--o--o  <-- mainline 

变基topicmainline我们需要(1)发现,上topic的提交,但不mainline(这是CB ,并沿着第一行A,结束于标记为*的提交),然后(2)将它们复制到新的提交中,我们将在mainline的提示下添加新提交。

再次基于第一发现三个后*提交,并将它们放入一个(反向下令:ABC)列表(也忽略了合并默认的提交,但这里没有合并)。然后它为每个提交做一个樱桃选择。

为了挑选A,Git比较A而不是*。这将两个快照转换为变更集。混帐然后应用最尖端提交的mainline的更改,使一个新的承诺,让我们称之为A',在一个匿名的分支:

  A--B--C <-- topic 
     /
...--o--*--o--o  <-- mainline 
       \ 
       A' <-- HEAD 

要樱桃采摘B,Git的diff文件BA。将这些更改应用于A'会产生另一个提交B'。重复C获得C'

  A--B--C   <-- topic 
     /
...--o--*--o--o   <-- mainline 
       \ 
       A'-B'-C' <-- HEAD 

最后,从Git的剥离Ctopic标签路程,它指向C'代替。链老被放弃(虽然你仍然可以通过reflogs找到它,rebase副本C的ID,以特殊的名字ORIG_HEAD以及):

  A--B--C   [abandoned] 
     /
...--o--*--o--o   <-- mainline 
       \ 
       A'-B'-C' <-- topic 

现在的重订完成。

请注意,如果需要,每个副本都使用git的合并机制完成(如果diffs不适用于干净地)。每个人都可能导致合并冲突,需要重组停止并获得您的帮助。 (或者,更糟糕的是,你可能会错误合并,尽管这些在实践中很少见。)

当然,如果您重新订购提交(通过在交互式转化中移动pick行),我们只需更改我们选择的顺序并应用每个提交。樱桃采摘操作仍然以相同的方式工作:比较挑选的提交与其父母(CB,A*,BA)。

+0

但差异数据取决于前一次提交中文件的内容,重新排序后它们会发生变化。或者这是只重新订购化妆品? –

+0

新副本是*新副本*,这意味着所有这一切。例如,假设在选择'B'的时候你会遇到合并冲突,因为'mainline'的提示有一个冲突的变化。当你修复冲突并继续rebase时,新的提交'B'现在与原来的提交'B'有不同的改变。 'B'和'B''仍然在版本库中,并且在尝试将该更改应用于'B''之前,下一个樱桃选择器(假设它用于'C')比较'C'和'B'(由于'B'现在不同,所以可能会发生另一次合并冲突!)。 – torek

+0

我想我现在看到你的评论并重新阅读你的答案后就看到了。看来我刚刚被术语所抛弃。正如我现在看到的那样,当然,提交可以重新排序,但重新绑定后的结果提交是完全新的提交,无论您是否重新排序它们。这个结果提交也有一个不同的“快照文件”,这是将樱桃采摘的差异应用到主线尖端的结果。以这种方式,重新排序是美化的,因为重新排序的原始提交保持不变。请让我知道,如果我是对的。 –