คำสั่ง git diff แสดงความแตกต่างระหว่างไฟล์ใน 2 Commits หรือระหว่าง Repository ปัจจุบันกับ Commit ก่อนหน้า คำสั่งนี้แสดงการเปลี่ยนแปลงพร้อม Headers และ Metadata สำหรับไฟล์ที่เปลี่ยนแปลง
เมื่อทำงานกับ Git Version Control System คุณอาจต้องการเปรียบเทียบข้อมูลใน Repository กับ Data Source อื่น เช่น เปรียบเทียบ 2 Commits ต่างกัน หรือ 2 ไฟล์
นั่นคือที่มาของฟังก์ชัน Diff Diffing เป็นฟังก์ชันที่รับ Input 2 ตัว และแสดงการเปลี่ยนแปลงที่มีอยู่ระหว่าง Data Sources นั้น ฟังก์ชัน Diff สามารถรันได้บน Branches, Files, และ Commits
บทช่วยสอนนี้จะอภิพายพื้นฐานของ Diffing กับ Git และวิธีใช้คำสั่ง git diff พร้อมตัวอย่าง จบบทความคุณจะเป็น Expert ในการใช้ git diff แล้ว
Git Diff Command
คำสั่ง git diff แสดงความแตกต่างระหว่างไฟล์ใน 2 Commits หรือระหว่าง Commit กับ Repository ปัจจุบัน คุณสามารถเห็นข้อความที่ถูกเพิ่ม ลบ และเปลี่ยนแปลงในไฟล์
Syntax ของ git diff command:
git diff
โดย Default git diff จะแสดง Uncommitted Changes ของ Repository ของคุณ
เราสามารถเห็นบรรทัดที่ถูกลบจากไฟล์ต้นฉบับ รวมถึงบรรทัดที่เพิ่มหรือเปลี่ยนแปลงในไฟล์ต้นฉบับ Git diff มักใช้เปรียบเทียบ Branches ใน Git Repository
Git Diff Between Commits
คุณสามารถเปรียบเทียบไฟล์ระหว่าง 2 Git Commits โดยระบุชื่อ Ref ที่อ้างอิง Commits ที่ต้องการเปรียบเทียบ Ref อาจเป็น Commit ID หรือ HEAD ซึ่งอ้างถึง Current Branch
git diff <commit1> <commit2>
ลองเปรียบเทียบ 2 Commits ใน Git Repository ของเรา
ก่อนอื่น ต้องดึง ID ของ Commits ที่ต้องการเปรียบเทียบ ทำได้ด้วย git log --pretty=oneline ซึ่งคืน Summary สรุปของ Commits ทั้งหมดใน Repo:
git log --pretty=oneline
คำสั่งคืนค่า:
5141ea9c41cdc7152408bfcab54a910f34441855 (HEAD -> master) feat: Update README.md 749055ee99df2aa6f5adc4cbe4bfc708395f1c2e docs: Create README.md
สมมติเราต้องการเปรียบเทียบ 2 Commits นี้ สามารถทำได้ด้วยคำสั่ง:
git diff 5141ea9c41cdc7152408bfcab54a910f34441855 749055ee99df2aa6f5adc4cbe4bfc708395f1c2e
คำสั่งด้านบนจะทำ Diff Operation ระหว่าง 2 Commits ของเรา
Git Diff Between Branches
เพื่อเปรียบเทียบ 2 Git Branches ด้วย Diff Command ให้ระบุ 2 Branches ที่ต้องการเปรียบเทียบเป็น Arguments ต้องใช้ 2 จุด (..) ระหว่างชื่อ Branch แต่ละตัว จุดเหล่านี้บ่งชี้ว่าต้องการอ่าน Latest Commit ในแต่ละ Branch และเปรียบเทียบกัน:
git diff <branch1>..<branch2>
สมมติเราต้องการเปรียบเทียบ Branch "master" กับ Branch "dev-v0.9" ใน Repository เราสามารถทำได้ด้วย:
git diff master dev-v0.9
เมื่อรันคำสั่งนี้ Diff จะรันระหว่าง Branch "master" และ "dev-v0.9" ใน Codebase ของเรา
เช่นกัน คุณสามารถเปรียบเทียบไฟล์เฉพาะข้าม 2 Branches ต่างกันได้ ใช้ Syntax เดียวกันและเพิ่มระบุไฟล์ที่ต้องการเปรียบเทียบ
สมมติเราต้องการเปรียบเทียบไฟล์ README.md ข้าม Branch "master" และ "dev-v0.9" ทำได้ด้วย:
git diff master dev-v0.9 ./README.md
นี่จะเปรียบเทียบไฟล์ README.md (อยู่ใน Current Directory แทนด้วย ./) ข้าม Branch "master" และ "dev-v0.9"
Git Diff Command Example
สมมติเรา Initialize Blank Repository และต้องการเริ่ม Repository ด้วยไฟล์ README.md เราสร้าง README.md ที่มีประโยค:
This is an example of the Git diff feature.
Prepare Files and Commits
เราจะสร้าง Commit ด้วยไฟล์นี้ใช้ git commit:
git commit
นี่ช่วยให้เราบันทึกการเปลี่ยนแปลงที่ทำไปที่ Repository Git Command คืนค่า:
[master (root-commit) 749055e] docs: Create README.md 1 file changed, 1 insertion(+) create mode 100644 README.md
หากรัน git diff ตอนนี้ ไม่จะเกิดอะไรขึ้น เพราะ Repository 初始化 แล้ว ไม่มีการเปลี่ยนแปลงระหว่างไฟล์ใน Repository ตอนนี้เรามี Basic Repository แล้ว เราสามารถเปลี่ยนเนื้อหาไฟล์ใน Repo ได้ ซึ่งจะช่วยให้เห็น git diff ในการทำงาน
สมมติเราต้องการเพิ่มประโยค "We just added this line to our file." เข้า README.md ทำได้ด้วย:
echo "We just added this line to our file." >> README.md
คำสั่งด้านบนเพิ่มประโยคของเราเข้า README.md
หมายความว่าตอนนี้มีความแตกต่างระหว่าง README.md เริ่มต้น และ README.md ปัจจุบันใน Repository
โดยรัน git diff เราสามารถเห็นความแตกต่างระหว่าง 2 ไฟล์นี้ โดย Default git diff จะ Produce Diff สำหรับทุกไฟล์ระหว่าง Latest Commit และ Current State ของ Repository
Run a Git Diff Between Commits
เมื่อรันคำสั่ง Response ที่คืนมาคือ:
diff --git a/README.md b/README.md index f808522..f08e544 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ +We have just added this line to our file.
This is an example of the Git diff feature.
นี่คือผลลัพธ์ทั่วไปของ git diff ผลลัพธ์แสดงสิ่งที่เพิ่มหรือลบในไฟล์ใน Combined Diff Format
Git diff command คืนรายการการเปลี่ยนแปลงทั้งหมดในทุกไฟล์ระหว่าง Last Commit และ Current Repository
หากต้องการดูการเปลี่ยนแปลงของไฟล์เฉพาะ สามารถระบุไฟล์นั้นเป็น Parameter ที่ 3 สมมติเราอยากเห็นแค่การเปลี่ยนแปลงของ README.md
ในตัวอย่างนี้ เราเปลี่ยนแค่ README.md ดังนั้นการเปลี่ยนแปลงนั้นๆ จะแสดงอยู่แล้ว แต่ถ้าทำงานกับ Repo ใหญ่ อาจต้องการเปรียบเทียบแค่ไฟล์เดียว ทำได้ด้วย:
git diff README.md
คำสั่งนี้เปรียบเทียบ Current Version ของ README.md กับ Version ล่าสุดที่ Commit เข้า Repository ของเรา
Git Diff Breakdown
Git diffs มี Components หลายอย่างที่เราสามารถใช้วิเคราะห์การเปลี่ยนแปลงระหว่างไฟล์ใน Repository มาแยกวิเคราะห์ด้วยตัวอย่างก่อนหน้า
Input Files
Component แรกของ Diff คือ Input Files ส่วนนี้บอกว่าไฟล์ไหนกำลังถูกเปรียบเทียบใน Diff
เรากำลังเปรียบเทียบ README.md ใน Current Version กับ README.md ใน Last Version สิ่งนี้ระบุบรรทัดแรกของโค้ด:
diff --git a/README.md b/README.md
Metadata
ต่อมา Diff ของเรามี Metadata ของ Git Repository Metadata นี้แสดง Object Version Labels ที่ Git ใช้ Track การเปลี่ยนแปลงที่คุณทำไปที่ไฟล์
ข้อมูลนี้ไม่ค่อยใช้ในกรณีส่วนใหญ่ของ Diff Command ในตัวอย่างข้างต้น Metadata 长这样:
index f808522..f08e544 100644
Change Markers
ส่วนต่อไปของ Git Diff Output คือ Change Markers File Pattern Markers นี้บอกประเภทการเปลี่ยนแปลงที่ทำไปที่ไฟล์ Change Markers ในตัวอย่าง:
--- a/README.md +++ b/README.md
Markers บอกว่า Changes จาก a/README.md ถูกทำ (Minus Signs) ซึ่งสะท้อนใน b/README.md (Plus Signs)
Code Changes
สุดท้าย Diff คืนรายการ การเปลี่ยนแปลงของโค้ด ต่างจาก Full File Comparison Diffs แสดงเฉพาะส่วนของไฟล์ที่เปลี่ยนแปลง ในตัวอย่างเราเพิ่ม 1 บรรทัด ซึ่งคืนผล:
@@ -1 +1,2 @@ This is an example of the Git diff feature. +We have just added this line to our file.
บรรทัดแรกคือ Summary ของการเปลี่ยนแปลง บอกว่าเราเพิ่ม 1 บรรทัด (+1) เริ่มที่บรรทัดที่ 2 (2)
จากนั้นแสดงรายการการเปลี่ยนแปลง เนื่องจากเราเพิ่มบรรทัด "We have just added this line to our file." บรรทัดนั้นจึงปรากฏใน Diff เครื่องหมาย Plus บอกว่าเราเพิ่มบรรทัดนั้นเข้าไฟล์
สรุป
Diffing เป็นฟังก์ชันที่มีประโยชน์ใน Git ให้คุณเปรียบเทียบ 2 ไฟล์ Branches หรือ Commits ใน Git Repository ช่วยให้เห็นการเปลี่ยนแปลงที่เกิดขึ้นนับจากจุดหนึ่งใน Repository ของคุณ
บทช่วยสอนนี้อภิปรายพื้นฐาน Diffing กับ Git และวิธีใช้ git diff command ทำ Diff Operation ตอนนี้คุณพร้อมที่จะใช้ git diff command อย่างมืออาชีพแล้ว!
สำหรับ Learning Resources เพิ่มเติมเกี่ยวกับ Git ดูคู่มือ How to Learn Git ของเรา