據我所知,提交文件的快照所以如果我執行更改A然後更改B,更改B的提交文件已包含更改A中的更改,不會重新排序更改A冗餘嗎?爲什麼使用git rebase -i重新排序提交不會搞砸歷史?
回答
也就是說,其實是一個非常好的問題,因爲提交是快照。
底墊原因的工作原理是因爲底墊實際上是重複git cherry-pick
(有位在前面包裹的找出該選擇什麼樣的,多在年底移動分支標籤),並git cherry-pick
作品轉動承諾變更集。
假設,例如,你有提交的序列:
A--B--C <-- topic
/
...--o--*--o--o <-- mainline
變基topic
到mainline
我們需要(1)發現,上topic
的提交,但不mainline
(這是C
,B
,並沿着第一行A
,結束於標記爲*
的提交),然後(2)將它們複製到新的提交中,我們將在mainline
的提示下添加新提交。
再次基於第一發現三個後*
提交,並將它們放入一個(反向下令:A
,B
,C
)列表(也忽略了合併默認的提交,但這裏沒有合併)。然後它爲每個提交做一個櫻桃選擇。
爲了挑選A
,Git比較A
而不是*
。這將兩個快照轉換爲變更集。混帳然後應用最尖端提交的mainline
的更改,使一個新的承諾,讓我們稱之爲A'
,在一個匿名的分支:
A--B--C <-- topic
/
...--o--*--o--o <-- mainline
\
A' <-- HEAD
要櫻桃採摘B
,Git的diff文件B
對A
。將這些更改應用於A'
會產生另一個提交B'
。重複C
獲得C'
:
A--B--C <-- topic
/
...--o--*--o--o <-- mainline
\
A'-B'-C' <-- HEAD
最後,從Git的剝離C
的topic
標籤路程,它指向C'
代替。鏈老被放棄(雖然你仍然可以通過reflogs找到它,rebase
副本C
的ID,以特殊的名字ORIG_HEAD
以及):
A--B--C [abandoned]
/
...--o--*--o--o <-- mainline
\
A'-B'-C' <-- topic
現在的重訂完成。
請注意,如果需要,每個副本都使用git的合併機制完成(如果diffs不適用於乾淨地)。每個人都可能導致合併衝突,需要重組停止並獲得您的幫助。 (或者,更糟糕的是,你可能會錯誤合併,儘管這些在實踐中很少見。)
當然,如果您重新訂購提交(通過在交互式轉化中移動pick
行),我們只需更改我們選擇的順序並應用每個提交。櫻桃採摘操作仍然以相同的方式工作:比較挑選的提交與其父母(C
與B
,A
與*
,B
與A
)。
但差異數據取決於前一次提交中文件的內容,重新排序後它們會發生變化。或者這是隻重新訂購化妝品? –
新副本是*新副本*,這意味着所有這一切。例如,假設在選擇'B'的時候你會遇到合併衝突,因爲'mainline'的提示有一個衝突的變化。當你修復衝突並繼續rebase時,新的提交'B'現在與原來的提交'B'有不同的改變。 'B'和'B''仍然在版本庫中,並且在嘗試將該更改應用於'B''之前,下一個櫻桃選擇器(假設它用於'C')比較'C'和'B'(由於'B'現在不同,所以可能會發生另一次合併衝突!)。 – torek
我想我現在看到你的評論並重新閱讀你的答案後就看到了。看來我剛剛被術語所拋棄。正如我現在看到的那樣,當然,提交可以重新排序,但重新綁定後的結果提交是完全新的提交,無論您是否重新排序它們。這個結果提交也有一個不同的「快照文件」,這是將櫻桃採摘的差異應用到主線尖端的結果。以這種方式,重新排序是美化的,因爲重新排序的原始提交保持不變。請讓我知道,如果我是對的。 –
- 1. 'git merge'如何搞亂你的提交歷史?
- 2. 混帳:改寫歷史:重新排序和合並提交
- 3. 重寫GIT中提交歷史
- 4. git rebase,提交重複
- 5. GIT rebase - 多個提交到一個 - 仍在歷史中看到
- 6. 爲什麼git pull --rebase在重放現有提交時失敗?
- 7. Git rebase重新排列提交涉及相同的文件
- 8. 爲什麼我會與git rebase -p -i發生衝突?
- 9. 使用git rebase更改之前提交的代碼-i
- 10. Github - 副本github提交歷史
- 11. rebase之後推出新的歷史?
- 12. 爲什麼不git rebase -i:/ ^主要工作?
- 13. git改寫歷史(rebase舊分支?)
- 14. 重新排序提交
- 15. 不通過所有提交重寫git回購歷史記錄
- 16. 爲什麼git svn dcommit會失去本地分支合併提交的歷史記錄?
- 17. 爲什麼不git的變基導致線性項目歷史
- 18. Git:修改歷史提交的內容
- 19. git rebase分支後推新提交
- 20. 搞砸了我的rebase?樹不再是平坦的
- 21. 壓扁多個歷史提交
- 22. 重寫歷史記錄以刪除重複的提交消息
- 23. Git:爲什麼rebase會導致衝突,而merge不會呢?
- 24. 猛砸歷史範圍
- 25. 如何使用git rebase清理錯綜複雜的歷史
- 26. 爲什麼要截斷BytesIO搞砸了?
- 27. Git commit squashing(rebase -i):提交實際上如何工作?
- 28. Git - 從以前的提交和拆分提交歷史分支
- 29. GIT - 重寫提交歷史記錄的作者
- 30. 重寫git歷史記錄以解壓縮提交
Git根據需要做差異; rebase將差異應用於新的基本內容。 – jthill