สร้าง Patch จาก git diff

ถ้าแก้โค้ดที่ใช้ git อยู่แล้วอยากจะสรุป change ที่ทำไปใส่ไฟล์ เพื่อส่งให้เพื่อน แล้วให้เพื่อนเอาไป apply patch ที่เครื่องของตัวเอง สามารถทำด้วย command ง่ายๆ

ลองมาค่อย ๆ ดูตัวอย่างทีละเสต็ปกันนะ (แต่แอบรู้สึกว่า ตัวอย่างละเอียดเกินไปหน่อยนะ)

ตอนแรก git statusดู ทุกอย่างโอเค
ก็เปิดโค้ดมาดูด้วย VS Code

เปิดไฟล์ที่เราต้องการแก้ไขขึ้นมาดู ตอนแรกเป็นแบบซ้ายมือ ลบ ๆ แก้ ๆ จนเป็นแบบทางขวา

สามารถดู changes โดย VS Code จะเทียบให้ดูข้างๆ กันแบบนี้
สีแดงทางซ้ายคือที่โดนลบไป สีเขียวขวามือคือที่เพิ่มขึ้นมา

กลับมาดู ที่ command line กันบ้าง
ลอง git statusดูเซะ

จากด้านล่างจะเห็นว่ามี ไฟล์ถูกแก้ไข 1 ไฟล์

ยังไม่สาแก่ใจ ลอง git diffดูซิ
ก็จะเห็น ที่แก้ไข
สิ่งที่ถูกลบออก จะมีเครื่องหมายลบ (-)ข้างหน้า
สิ่งที่ถูกเพิ่ม จะมีเครื่องหมายบวก (+) ข้างหน้า

ต่อไปเป็นการสร้างไฟล์ patch หรือ diff file แล้วล่ะ
จัดคอมมานด์นี้…

ตรงชื่อไฟล์ edit_content.diff จะใช้ชื่ออะไรก็ได้
นามสกุล จะเป็น .diff หรือ .patch หรืออะไรก็ได้ ใช้ได้ไม่มีปัญหา

ส่วน -u คือบอกว่า เป็นการทำ Patch file ซึ่งอันที่จริง ไม่ต้องใส่ก็ได้ เป็น default น่ะ :P
Option --noio-prefix เดี๋ยวขออธิบายตอนท้าย ๆ นะจ๊ะ

เปิดดูผลลัพธ์ที่ได้ โดยการเปิดไฟล์ edit_content.diff ใน VS Code ก็จะเห็นว่าหน้าตาเหมือน git diff หรือที่ดู changes จากใน vs code นั่นแหละ แต่ใช้สีฟอนต์ต่างกันเท่านั้นเอง

ต่อไปจะทำให้ โค้ดกลับไปเป็นเหมือนเดิม เพื่อจะได้ลองใช้ Patch ที่สร้างขึ้นมาตะกี้ดู
ใช้คอมมานด์ git checkout ละกันนะ

ลองตรวจดูว่าโค้ดกลับไปเป็นเหมือนเดิมมั้ย

อืม…​ เหมือนเดิมแล้วล่ะ…

ต่อไปก็ Patch

คอมมานด์นี้มี option -i คือให้ทำการ patch จาก ไฟล์ชื่อ edit_content.diff
ส่วน option -p จะอธิบายพร้อม option git diff no prefix

คราวนี้เปิดไฟล์ มาดูซิว่า apply patch แล้วเวิร์คมั้ย

โอเค เวิร์ค!

ต่อไปเป็นการอธิบายเพิ่มเติม ตรง optio--no-prefix ของ git diff

สำหรับ command git diff รูปด้านล่างเปรียบเทียบแบบ ไม่ใส่ --no-prefix กับแบบที่ใส่

ซ้าย test.diff “ไม่ได้ใส่” — no-prefix . ส่วนทางขวา edit_content.diff ใส่option no-prefix

เวลา Apply patch ก็จะต้องระบุค่า -p ต่างกัน เพราะอ้างอิง folder tree ต่างกันเท่านั้นเอง

-p1 สำหรับ patch ที่อ้างอิง folder ตั้งต้นเอาไว้ เผื่อว่าเป็นการทำ diff ที่คนละ folder กันนั่นเอง ในตัวอย่างนี้

-p0 สำหรับ patch ที่ --no-prefix

ตัวอย่าง สำหรับ diff file ที่ เริ่มต้นจาก folder ต่างกัน

ถ้าใช้ diff (ไม่ใช่ git diff นะ)
เปรียบเทียบไฟล์ ที่อยู่คนละโฟลเดอร์ ในที่นี้คือ patch2 กับ patch แล้วเอาไปเก็บที่ไฟล์ชื่อ diff-u.diff
-u ตรงนี้ต้องใส่ เพราะ เลือก format ของ diff file ให้เป็นแบบ Unified

พอเปิดขึ้นมา ดูที่ขีดเส้นใต้ไว้

แต่ git diff เป็นการเปรียบเทียบที่โฟลเดอร์ เดียวกันนั่นเอง เราจึงใส่ --no-prefix ซะก็ได้

--

--