繁體中文

開發者工具·文字比較

雙向差異與三向合併:為什麼比較與合併不同

· 背景

文字差異 合併衝突 版本控制

在衝突邊界處相遇的三個分支旁邊比較兩個文字狀態
原始 ToolAcre 向量圖

解釋比較兩個版本和合併兩個共享共同祖先的版本之間的區別,以及為什麼存在衝突標記。

兩個人編輯了同一個檔案:現在怎麼辦? — 當雙方都改變時,開啟兩個版本比較的限制

當兩個人編輯一個檔案時,比較他們的最終狀態會顯示差異,但不會顯示祖先。雙向差異缺乏判斷哪一方更改了特定原始行所需的共同基礎。它可以支援調查,但不能做出合併決定。

ToolAcre 恰好接受兩個名為 Original 和 Changed 的​​字串。交換視角;它不添加歷史記錄。任何需要基礎的工作流程,我們的和他們的都必須透過單獨的比較或使用真正的三向合併引擎來提供這些狀態。

雙向差異回答一個問題 - 重申比較告訴你什麼不同,而不是哪一方應該獲勝

雙向比較可以回答在選定的大小寫和空白選項下哪些有序行有所不同。行相等、刪除或新增。該結果中沒有任何內容表明一方是更新的、權威的或正確的,也沒有任何操作可以選出獲勝者。

當雙方編輯同一區域時,此限制很重要。僅出現在左側的行可能是有價值的新更改,而不是過時的刪除。如果沒有基礎證據,方向標籤描述的是比較視角,而不是發展年表。

共同的祖先改變了一切——解釋了基礎版本如何讓合併工具區分一方的更改和另一方的更改

共同祖先允許合併系統比較從基到左和從基到右。如果只有一個後代改變了一個區域,那麼這種改變可能會乾淨地結合起來;如果兩者都進行不相容的編輯,系統可能會出現衝突以供人工解決。

ToolAcre 沒有第三個輸入,也沒有合併演演算法。您可以貼上基礎和一個分支,記錄行,然後對另一個分支重複此操作。此手動分析有助於理解,但不會重新建立版本控制的所有放置和衝突規則。

解碼衝突標記 — 解釋 <<<<<<<、======= 和 >>>>>>>> 部分以及它們之間的內容

衝突標記(例如尖括號區塊)一旦貼到此處,即為文字文字。文字差異可以將標記的檔案與建議的解決方案進行比較,但它不會將部分解析為我們的、基礎的或他們的。它不會刪除標記或選擇內容。

解決權威儲存庫中的衝突,其中檔案名稱、祖先和測試仍然可用。僅當材料適合粘貼時才使用瀏覽器工具進行小的措辭檢查。視覺上乾淨的結果並不能證明合併的程序行為正確。

工作範例:與一個乾淨的區塊和一個衝突的合併 - 遍歷基礎、兩個編輯和結果輸出

從基線 `color=blue` 和 `limit=10` 開始。一根樹枝變色;另一個改變限制。基到分支的比較揭示了獨立的行,並合併可以合理地保留這兩者。如果兩者以不同的方式更改相同的限制,則文字衝突需要做出策略決定。

兩個分支之間的雙向比較顯示兩行不同,但無法推斷共享的起始值。這個缺失的事實正是比較不是合併的原因。將基礎加入推理中,然後在實際系統中測試所選的組合狀態。

雙向比較仍然有幫助的地方 - 描述將每一側與基礎進行比較,或根據預期檢查合併結果

雙向差異在解決衝突後仍然有用。將合併的摘錄與每個分支進行比較,以確認預期的貢獻得以保留,或與預期的手寫狀態進行比較。當空格或大小寫會影響語言時,請關閉規範化。

下載的補丁狀流可以記錄每次檢查,但不能套用或驗證合併。原始行號是每個貼上狀態的本機行號,並可能與相鄰編輯後的儲存庫位置不同。

這不包括什麼 — ToolAcre 的文字比較比較兩個文字;它不執行合併,並本文不涉及變基策略

ToolAcre 不執行合併、變基、衝突歸因或提交歷史分析。它沒有移動塊標籤,也沒有語義理解。這些是雙輸入線比較器的明顯後果,而不是隱藏在其他地方的缺失按鈕。

本文也沒有規定分支策略。團隊應該遵循他們的儲存庫控制、程式碼所有權和測試門。瀏覽器比較是一個輔助檢查介面,而不是替代的原始碼控制系統。

重點:透過 diff 來理解,透過合併來決定 — 總結了差異以及瀏覽器比較如何適合手動解決衝突

理解文字的差異; merge 來決定組合狀態。第一個可以與 ToolAcre 成對重複,而第二個則需要祖先、策略和驗證。將這些動詞分開可以防止清晰的行顯示被誤認為是安全整合。

解決衝突後,在實際專案中執行語法檢查、測試和網域審查。文字協定對於許多合併來說是必要的,但對於行為來說卻遠遠不夠。一旦相關行差異可見,瀏覽器的角色就結束了。