2016-04-29 124 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

我想我現在看到你的評論並重新閱讀你的答案後就看到了。看來我剛剛被術語所拋棄。正如我現在看到的那樣,當然,提交可以重新排序,但重新綁定後的結果提交是完全新的提交,無論您是否重新排序它們。這個結果提交也有一個不同的「快照文件」,這是將櫻桃採摘的差異應用到主線尖端的結果。以這種方式,重新排序是美化的,因爲重新排序的原始提交保持不變。請讓我知道,如果我是對的。 –