อะไรคือ "git diff --patience" เพื่ออะไร


219

อัลกอริทึมความอดทนแตกต่างจากgit diffอัลกอริทึมเริ่มต้นอย่างไรและเมื่อใดที่ฉันต้องการใช้


1
บางทีมันอาจจะตรงกับโค้ดที่ถูกย้ายและบรรทัดที่แก้ไขซึ่งอาจช้ากว่านี้มาก
codymanix

ฉันได้สกัดสคริปต์แบบสแตนด์อโลนสำหรับความอดทนต่างจากบาซ่า, คุณสามารถค้นหาได้ในหัวข้อ SO อีก
TryPyPy

38
คำถามติดตาม เมื่อใดที่ฉันไม่ควรใช้ความอดทนที่ต่างกัน
balki

4
นอกจากนี้ยังมี--histogramพารามิเตอร์ที่ "... ขยายอัลกอริธึมความอดทนเป็น" สนับสนุนองค์ประกอบทั่วไปที่เกิดขึ้นน้อย " git-scm.com/docs/git-diff.html
โรเบิร์ต

คำตอบ:


183

คุณสามารถอ่านโพสต์จาก Bram Cohenผู้เขียนอัลกอริทึม diff อดทน แต่ฉันพบโพสต์บล็อกนี้เพื่อสรุปขั้นตอนวิธี diff อดทนได้เป็นอย่างดี:

Patience Diff มุ่งเน้นพลังงานของมันในบรรทัดเนื้อหาที่มีความถี่ต่ำซึ่งทำหน้าที่เป็นเครื่องหมายหรือลายเซ็นของเนื้อหาสำคัญในข้อความ มันยังคงเป็นฐานที่แตกต่างของ LCS แต่มีความแตกต่างที่สำคัญเนื่องจากพิจารณาเฉพาะการเรียงลำดับบรรทัดที่ยาวที่สุดของลายเซ็น:

ค้นหาบรรทัดทั้งหมดที่เกิดขึ้นเพียงครั้งเดียวทั้งสองข้างจากนั้นทำการเรียงลำดับทั่วไปที่ยาวที่สุดบนบรรทัดเหล่านั้นจับคู่ให้ตรงกัน

คุณควรใช้ความอดทนต่างกันเมื่อใด ตามที่ Bram ความอดทนต่างกันดีสำหรับสถานการณ์นี้:

กรณีที่เลวร้ายจริงๆคือกรณีที่มีสองเวอร์ชั่นแยกกันอย่างมากและนักพัฒนาไม่ได้ระมัดระวังในการรักษาขนาดของแพตช์ให้อยู่ในการควบคุม ภายใต้สถานการณ์เหล่านั้นอัลกอริธึม diff อาจกลายเป็น 'แนว' ในบางครั้งซึ่งตรงกับส่วนที่ยาวของวงเล็บปีกกาด้วยกัน แต่มันก็มีความสัมพันธ์กับฟังก์ชั่นวงเล็บปีกกาในรุ่นหนึ่งด้วยวงเล็บปีกกาของฟังก์ชันต่อไปในรุ่นอื่น สถานการณ์นี้น่าเกลียดมากและอาจส่งผลให้ไฟล์ข้อขัดแย้งที่ใช้ไม่ได้โดยสิ้นเชิงในสถานการณ์ที่คุณต้องการนำเสนอสิ่งต่าง ๆ ให้สอดคล้องกันมากที่สุด


3
จากประสบการณ์ของฉันกับ XML สำหรับตอนนี้มันให้ผลลัพธ์ "เลวร้าย" เหมือนกันกับ diff ทั่วไป
stivlo

5
ฉันโชคดีขึ้นมากด้วยความอดทนที่ต่างจาก XML ความแตกต่างที่ฉันกำลังดูอยู่ในขณะนี้มีปัญหาแนวไม่ตรงที่อธิบายด้วยอัลกอริธึม diff ทั่วไป แต่ดูยิ่งใหญ่ด้วยความอดทนที่ต่างออกไป
me_and

22
บล็อกนี้มีการอธิบายที่ดีรวมถึงภาพเคลื่อนไหว gif ของกระบวนการ: alfedenzo.livejournal.com/170301.html
Quantum7

3
ฉันพบบล็อกนี้น่าสนใจมากและให้คำอธิบายที่ดีพร้อมลิงก์เพิ่มเติมไปยังรายละเอียดอัลกอริทึม: fabiensanglard.net/git_code_review/diff.phpหวังว่ามันจะเป็นประโยชน์กับใครบางคน
SathOkh

Frobnitz / fib / diff diff สามารถดูได้ที่gist.github.com/roryokane/6f9061d3a60c1ba41237
George V. Reilly

52

คุณยังสามารถใช้เพื่อการรวม (ทำงานได้ดีที่นี่สำหรับความขัดแย้ง XML บางอย่าง):

git merge --strategy-option=patience ...

51
หรือผ่านgit config --global diff.algorithm patience
Tobu

11
git merge -X patienceที่สั้นกว่าจะเป็น
PythonNut

42

อัลกอริทึม diff อดทนเป็นอัลกอริทึม diff ช้าลงที่แสดงผลลัพธ์ที่ดีขึ้นในบางกรณี

สมมติว่าคุณได้เช็คอินไฟล์ต่อไปนี้เพื่อคอมไพล์:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

ตอนนี้เราจัดลำดับส่วนใหม่และเพิ่มบรรทัดใหม่:

.bar {
    margin: 0;
}

.foo1 {
    margin: 0;
    color: green;
}

อัลกอริทึม diff เริ่มต้นอ้างว่าส่วนหัวมีการเปลี่ยนแปลง:

$ git diff --diff-algorithm=myers   
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
+.bar {
     margin: 0;
 }

-.bar {
+.foo1 {
     margin: 0;
+    color: green;
 }

ในขณะที่ความอดทนต่างกันแสดงผลลัพธ์ที่เข้าใจได้ง่ายกว่า:

$ git diff --diff-algorithm=patience
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
-    margin: 0;
-}
-
 .bar {
     margin: 0;
 }
+
+.foo1 {
+    margin: 0;
+    color: green;
+}

มีการสนทนาที่ดีมีคุณภาพต่างอัตนัยที่นี่และคอมไพล์ 2.11 คือการสำรวจการวิเคราะห์พฤติกรรม diff เพิ่มเติม

โปรดทราบว่าอัลกอริทึมอดทนต่างยังคงมีบางคนที่รู้จักกันในกรณีพยาธิวิทยา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.