สร้าง 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
กับแบบที่ใส่
เวลา 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
ซะก็ได้