เหตุใดจึงต้องใช้ diff / patch เมื่อง่ายต่อการใช้ cp


19
diff -u file1.txt file2.txt > patchfile

สร้างไฟล์แพตช์ซึ่งประกอบด้วยคำสั่งสำหรับpatchการแปลง file1.txt ให้เหมือนกับ file2.txt

ไม่สามารถใช้cpคำสั่งแทนได้หรือไม่ ฉันสามารถจินตนาการว่านี่จะเป็นประโยชน์เมื่อไฟล์มีขนาดใหญ่เกินไปและต้องถูกถ่ายโอนผ่านเครือข่ายซึ่งวิธีการนี้อาจช่วยประหยัดแบนด์วิดท์ มีวิธีอื่นในการใช้ diff / patch ซึ่งจะเป็นประโยชน์ในสถานการณ์อื่น ๆ หรือไม่?

คำตอบ:


31

ส่วนต่างอาจซับซ้อนกว่าการเปรียบเทียบไฟล์หนึ่งกับอีกไฟล์หนึ่ง สามารถเปรียบเทียบลำดับชั้นของไดเรกทอรีทั้งหมด ลองพิจารณาตัวอย่างที่ฉันต้องการแก้ไขข้อบกพร่องใน GCC การเปลี่ยนแปลงของฉันเพิ่มไฟล์หนึ่งหรือสองไฟล์ในไฟล์ 4 หรือ 5 ไฟล์และลบบรรทัดหนึ่งไฟล์ในไฟล์เหล่านั้นและไฟล์อื่น ๆ หากฉันต้องการสื่อสารการเปลี่ยนแปลงเหล่านี้กับใครบางคนอาจรวมอยู่ใน GCC ตัวเลือกของฉันคือ

  • คัดลอกแผนผังต้นทางทั้งหมด
  • คัดลอกเฉพาะไฟล์ที่มีการเปลี่ยนแปลง
  • จัดหาการเปลี่ยนแปลงที่ฉันทำ

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

ดิฟเฟอร์ยังสามารถใช้เพื่อจัดทำประวัติ เกิดอะไรขึ้นถ้าการเปลี่ยนแปลงสามเดือนที่ผ่านมาทำให้เกิดข้อผิดพลาดฉันเพิ่งค้นพบในวันนี้ หากฉันสามารถ จำกัด เวลาที่ข้อบกพร่องถูกนำมาใช้และสามารถแยกมันเป็นการเปลี่ยนแปลงที่เฉพาะเจาะจงฉันสามารถใช้ diff เพื่อ "เลิกทำ" หรือย้อนกลับการเปลี่ยนแปลง นี่ไม่ใช่สิ่งที่ฉันสามารถทำได้อย่างง่ายดายถ้าฉันเพียงคัดลอกไฟล์ไปรอบ ๆ

ทั้งหมดนี้เชื่อมโยงกับการควบคุมเวอร์ชันต้นทางที่โปรแกรมอาจบันทึกประวัติไฟล์เป็นชุดข้อมูลที่แตกต่างจากเวลาที่สร้างจนถึงปัจจุบัน diffs ให้ประวัติ (ฉันสามารถสร้างไฟล์เหมือนเดิมในวันใดวันหนึ่ง) ฉันสามารถดูว่าใครจะโทษว่าทำลายบางสิ่ง (diff มีเจ้าของ) และฉันสามารถส่งการเปลี่ยนแปลงไปยังโครงการต้นน้ำโดยให้ diffs เฉพาะพวกเขา ( บางทีพวกเขาอาจสนใจเปลี่ยนแปลงเพียงครั้งเดียวเมื่อฉันทำหลายอย่าง)

โดยสรุปใช่cpง่ายกว่าdiffและpatchแต่ยูทิลิตี้ของdiffและpatchดีกว่าcpสำหรับสถานการณ์ที่การเปลี่ยนแปลงไฟล์สำคัญต่อการติดตาม


ในความเป็นจริงแล้วคอมไพล์ไม่ได้จัดเก็บประวัติไฟล์ตามความแตกต่างของข้อผูกมัดที่ตามมา สำหรับการกระทำแต่ละรายการคือร้านค้าเนื้อหาของแต่ละไฟล์ (ดู "git show -s --pretty = raw" และ "git ls-tree HEAD") จากนั้นด้านบนของเลเยอร์นี้ไฟล์จำนวนมากจะคล้ายกันในคอมมิทที่ต่างกันมันใช้การบีบอัดเดลต้าเพื่อแชร์ไฟล์ bewteen ข้อมูล (แต่นี่ไม่ได้เชื่อมโยงกับประวัติ)
ysdx

อย่างไรก็ตาม diffs เป็นเครื่องมือสร้างภาพข้อมูลที่สะดวกสำหรับประวัตินี้
ysdx

20

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

แพทช์มีข้อมูลเกี่ยวกับของเก่าและสถานะใหม่ของไฟล์ หากคุณได้รับไฟล์ที่ถูกคัดลอกคุณจะไม่ทราบว่าต้นฉบับคืออะไร (สถานะเดิม) และคุณไม่สามารถใช้ความแตกต่างกับไฟล์ (หรือชุดของไฟล์) ที่คุณเปลี่ยนแปลงด้วยเช่นกันโดยไม่มีปัญหาใด ๆ ดังนั้นสำหรับชุดของไฟล์ต้นฉบับมันไม่ได้เป็นการรักษาพื้นที่ที่มีความกังวลหลักมันเป็นข้อมูลก่อนหลัง

ก่อนหน้า (บริบท / รวมเป็นหนึ่ง) สิ่งนี้มักจะเกิดขึ้นพร้อมกับคำแนะนำสำหรับบรรณาธิการ (แทรกบรรทัดหลัง X, ลบบรรทัด Y) แต่นั่นจะใช้ได้เฉพาะเมื่อคุณรู้สถานะการสอนเหล่านี้เริ่มต้น ดังนั้นจึงมีปัญหาเช่นเดียวกับ "ทางออก" ของคุณด้วยการคัดลอกเพียง


2
ไฟล์แพทช์ยังช่วยให้คุณสามารถยกเลิกและนำไปใช้กับไฟล์หลายไฟล์พร้อมกันได้
Gilsham

อันที่จริง diffs แบบครบวงจร ( diff -u) เป็นการปรับปรุงที่ออกแบบมาสำหรับมนุษย์พวกเขาไม่ได้ช่วยความแข็งแกร่งต่อความขัดแย้งในบริบทปกติ ( diff -c) แม้แต่ diffs ธรรมดา ( diff) ก็ยังสามารถใช้งานได้โดยไม่ทราบว่า "คำสั่งเหล่านี้เริ่มต้นจาก" อย่างไรก็ตามนี่เป็นคำตอบที่ดีกว่าคำตอบที่ได้รับการยอมรับเพราะการพูดคุยเกี่ยวกับวิธีการที่แพทช์ไฟล์สามารถแก้ไขไฟล์หลายไฟล์ในเวลาเดียวกันเป็นปลาเฮอริ่งแดง
Celada

@celeda คุณถูกต้องเกี่ยวกับบริบทที่แตกต่างระหว่างสิ่งนั้นและความต่างปกติคือที่ซึ่งความแตกต่างหลักอยู่ หากไม่มีการแก้ไขเนื้อหาจะนำไปใช้ในทางกลับกันได้ยากขึ้นถ้าหากทั้งหมด
Anthon

12

หากคุณใช้ diff คุณสามารถเห็นสิ่งที่เปลี่ยนแปลงไปดังนั้นการใช้ diff / patch เป็นวิธีการป้องกันไม่ให้ใครบางคนลื่นไถลการเปลี่ยนแปลงที่ไม่ต้องการในไฟล์


11

การเปลี่ยนแปลงที่ทำกับไฟล์มักจะเล็กกว่าไฟล์ที่ถูกเปลี่ยนแปลง

ซึ่งหมายความว่าการจัดเก็บส่วนต่างสามารถประหยัดพื้นที่ได้มาก เมื่อdiffถูกสร้างขึ้นพื้นที่ดิสก์มีราคาแพง

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

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

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

ดังนั้นการทำงานกับ diffs จะช่วยให้การพัฒนาพร้อมกัน คุณไม่จำเป็นต้องทำงานกับการเปลี่ยนแปลงครั้งเดียวอีกต่อไป

ระบบควบคุมเวอร์ชันเวอร์ชันกระจายที่ทันสมัยเป็นความต่อเนื่องของวิธีการทำงานนี้


1

ในระยะสั้นก็สามารถ หากคุณดูวิดีโอของ Thinkg Big Larry Wall บน youtube เขาพูดถึงความแตกต่างของแพทช์ / การเริ่มต้นและปัญหาที่แก้ไขได้และที่สำคัญคือการลดขนาดสำหรับการสื่อสารผ่านอินเทอร์เน็ตในขณะที่ทำให้แพทช์มีความยืดหยุ่นและอ่านง่าย .

หากคุณอยู่ในระบบท้องถิ่นและไม่สนใจเกี่ยวกับสิ่งใดสิ่งเหล่านี้แล้วcpหรือrsyncจะมีการปรับ


ขอบคุณ PSKocik คุณช่วยแบ่งปันลิงก์ไปยังวิดีโอนั้นได้ไหม
toddlermenot

ฉันไม่เห็นด้วยกับคำสั่งสุดท้าย ไม่เกี่ยวกับขนาดวันนี้มันเกี่ยวกับการติดตามกระบวนการพัฒนาของคุณเพื่อให้ง่ายต่อการจัดการ
reinierpost

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