git แตกต่างสองไฟล์บนสาขาเดียวกันคอมมิตเดียวกัน


98

ขออภัยหากมีคำถามนี้ฉันไม่พบคำถามที่น่าแปลกใจ: /

ฉันจะดำเนินการgit diffระหว่างสองไฟล์ภายในสาขาเดียวกันและคอมมิตเดียวกันได้อย่างไร

กล่าวคือ git diff fileA.php fileB.php

(โดยเฉพาะอย่างยิ่งกับรหัสสีที่อ่านง่ายซึ่งgitมี .... หรือคล้ายกับที่โปรแกรม BeyondCompare ทำ!)


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

คำตอบ:


83

คุณไม่จำเป็นต้องใช้คอมไพล์สำหรับสิ่งนั้นเพียงแค่ใช้diff fileA.php fileB.php(หรือ vimdiff ถ้าคุณต้องการเปรียบเทียบแบบเคียงข้างกัน)


22
vimdiffสำหรับผู้ชนะ! ขอบคุณ!
ง -_- ข

24
สิ่งนี้อาจใช้งานได้ แต่ไม่แตกต่างกัน เป็นรูปแบบผลลัพธ์ที่แตกต่างกันอย่างสิ้นเชิง
daboross

11
สิ่งนี้ไม่ตอบคำถามเดิม
DylanYoung

8
ฉันไม่เห็นด้วย OP ไม่ชัดเจน แต่การที่เขาพูดถึง BeyondCompare บ่งบอกเป็นนัยว่าเขาไม่ได้มองหาgit diffข้อแตกต่างที่อ่านง่ายโดยเฉพาะ อีกทั้งความจริงที่เขายอมรับคำตอบของฉันว่าเขากำลังมองหายังบ่งบอกว่ามันตอบโจทย์จริง
JaredMcAteer

3
อ่านคำตอบอย่างใกล้ชิด คำสั่งdiff fileA fileBไม่ได้git diff fileA fileB
Matthew Hinea

249

หากคุณต้องการใช้git diffกับไฟล์สองไฟล์โดยพลการคุณสามารถgit diff --no-index <file_a> <file_b>ใช้ได้ ไม่จำเป็นต้องติดตามทั้งสองไฟล์เพื่อให้สามารถgitใช้งานได้


33
+1 เมื่อตอบคำถามพื้นฐาน (ไม่ว่า "ทำไมคุณถึงทำอย่างนั้น" ... ก็มีเหตุผลได้)
NobodysNightmare

19
--word-diffไฮไลท์การเปลี่ยนแปลงทีละคำไม่ใช่แค่บรรทัด
user3148949

2
สำหรับพวกเราที่ใช้ PowerShell นี่เป็นวิธีที่ง่ายกว่ามากในการรับความแตกต่างของสองไฟล์ใน repo
Jay Soyer

3
คำตอบที่ยอดเยี่ยมด้านล่าง 2 รายการก่อนหน้านี้มีการโหวตน้อยลง (และมีประโยชน์น้อยกว่า) คำตอบอย่างไรเมื่อจัดเรียงตาม "ใช้งานอยู่" ??? ฉันไม่ได้นับคำตอบที่ทำเครื่องหมายว่าถูกต้องด้วยซ้ำ ยังไงก็ขอบคุณ!
j_random_hacker

@daboross ใน GNU diffutils 3.4+ (2016-08-08) diffมี--colorซึ่งอาจช่วยได้ (ดูunix.stackexchange.com/a/338960 ) แต่ถึงอย่างนั้นหากใช้diff-so-fancyดูเหมือนว่าจะต้องการรูปแบบเอาต์พุตเฉพาะของgit diff. diff -u(ดูstackoverflow.com/a/4857407/10095231 ) ไม่ทำงาน
kelvin

14

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

git diff <revision_1>:<file_1> <revision_2>:<file_2>

ตามที่ระบุไว้ที่นี่: https://stackoverflow.com/a/3343506/1815446

ในกรณีของคุณ (ระบุการแก้ไขเดียวกันสำหรับทั้งสองไฟล์):

git diff <revisionX>:fileA.php <revisionX>:fileB.php

หมายเหตุ: การแก้ไขอาจHEAD~2เป็น SHA-1 ชื่อสาขา ฯลฯ
ma11hew28

สิ่งนี้ใช้ได้ผลสำหรับฉันเพียงแค่เปรียบเทียบชื่อไฟล์จากสองไดเรกทอรีที่แตกต่างกัน: ใช้git diff --name-only HEAD:dir1 HEAD:dir1_backup งานได้หลังจากgit addไดเร็กทอรีทั้งสอง
Frank Forte

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

4

เพื่อให้ gnu diff ปกติดูเหมือน git diff มากขึ้นฉันขอแนะนำพารามิเตอร์เหล่านี้:

diff -burN file_or_dir1 file_or_dir2

(โดยที่-bละเว้นช่องว่าง, ความ-uแตกต่างแบบรวม, -rเรียกซ้ำ, -Nถือว่าไฟล์ที่หายไปเป็น/dev/null)

มันใช้งานได้ดี แต่ยังไม่มีสีและแทบจะไม่มีการจัดเพจอัตโนมัติแบบ git หากคุณต้องการแก้ไขทั้งสองอย่าง (ฉันทำ) ให้ติดตั้งcolordiffและใช้งานดังนี้:

colordiff -burN file_or_dir1 file_or_dir2 | less -R

สิ่งนี้ให้เอาต์พุตและอินเทอร์เฟซที่ใกล้เคียงกับของจริงgit diffมาก


4
-1 เนื่องจาก "คุณทำไม่ได้" ไม่ถูกต้อง (ดู: stackoverflow.com/a/13965200/968531 )
NobodysNightmare

ลบ "คุณทำไม่ได้" เพิ่มคำแนะนำในการติดตั้ง colordiff และนี่อาจเป็นคำตอบที่ใช้ได้สำหรับคำถามเดิม
DylanYoung


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