diff สำเนาการทำงานปัจจุบันของไฟล์ด้วยสำเนาที่กำหนดของสาขาอื่น


158

ฉันมี repo พร้อมไฟล์fooในสาขาหลัก fooผมเปลี่ยนบาร์สาขาและทำให้การเปลี่ยนแปลงบางอย่าง ตอนนี้ฉันจะเรียกใช้git diffระหว่างสำเนานี้ (ซึ่งยังไม่ได้ทำ) และสำเนาของสาขาหลักได้อย่างไร

คำตอบ:


151

งานต่อไปนี้สำหรับฉัน:

git diff master:foo foo

ในอดีตอาจเคยเป็น:

git diff foo master:foo


9
ทุกครั้งที่ฉันเห็นคำตอบของคุณเกี่ยวกับgit diffฉันคิดถึงstackoverflow.com/questions/5256249/git-diff-doesnt-show-enough/
VonC

@VonC: ขอบคุณมันเป็นเรื่องดีที่รู้ว่ามันคุ้มค่าที่จะวาด :) พวกคุณบังเอิญเข้าใจความผิดปกติที่ฉันได้อัพเดทคำตอบของฉันด้วยหรือเปล่า?
Mark Longair

2
คุณลอง a --เพื่อแยกพารามิเตอร์จากอาร์กิวเมนต์ของเส้นทางหรือไม่ git diff -- master:foo foo
VonC

1
ในวันที่ 1.8 git diff -- master:foo fooใช้งานไม่ได้ - ดูเหมือนว่าจะถือว่า arg master:fooเป็นชื่อไฟล์ที่ไม่มีอยู่ (และไม่สนใจ) แทนที่จะเป็นไฟล์ในสาขา ลองสลับ 2 args ล่าสุด - หากใช้งานได้การเปรียบเทียบ diff ควรกลับด้าน แต่เอาต์พุตไม่เปลี่ยนแปลง
เคลวิน

9
สำหรับฉันมันเป็นสิ่งที่ตรงกันข้าม - ฉันสามารถทำได้git diff master:foo fooแต่ไม่กลับกัน ฉันก็ไม่เข้าใจเหมือนกัน ด้วย git 1.7.9.5 / Ubuntu 12.04 อย่างน้อยฉันก็สามารถทำได้git diff -R master:foo fooเพื่อให้ได้ diff ที่ฉันต้องการจริงๆ เมื่อฉันพยายามที่มี msysgit 1.9.4 / Windows 7 x64 fatal: unable to read 0000000000000000000000000000000000000000ฉันได้รับ โดยไม่ต้อง-Rฉันได้รับข้อความแสดงข้อผิดพลาดเช่นเดียวกับคุณกับคอมไพล์ 1.7.9.5 แต่ด้วย 1.9.4 fatal: master:foo: no such path in the working treeฉันได้รับ
JMM

100

คุณกำลังพยายามเปรียบเทียบแผนผังการทำงานกับชื่อสาขาเฉพาะดังนั้นคุณต้องการสิ่งนี้:

git diff master -- foo

ซึ่งมาจาก git-diff รูปแบบนี้ (ดู manpage git-diff)

   git diff [--options] <commit> [--] [<path>...]
       This form is to view the changes you have in your working tree
       relative to the named <commit>. You can use HEAD to compare it with
       the latest commit, or a branch name to compare with the tip of a
       different branch.

FYI, นอกจากนี้ยังมีตัวเลือก--cached(aka --staged) สำหรับการดูความแตกต่างของสิ่งที่คุณจัดฉากมากกว่าทุกอย่างในแผนผังการทำงานของคุณ:

   git diff [--options] --cached [<commit>] [--] [<path>...]
       This form is to view the changes you staged for the next commit
       relative to the named <commit>.
       ...
       --staged is a synonym of --cached.

2
ขอบคุณ ไม่มีความคิดว่าทำไม แต่คำตอบนี้ใช้ได้สำหรับฉันกับ git 1.8.1 ใน Linux เท่านั้น
srking

ยอดเยี่ยมขอบคุณ ฉันเมาที่ต้องการรวมชื่อสาขาปัจจุบันของฉันในคำสั่ง diff แต่ฉันเห็นว่าไม่จำเป็น
yoyo

สิ่งนี้ใช้ได้กับฉันเมื่อไม่กี่เดือนที่ผ่านมา แต่ดูเหมือนจะไม่เป็นเช่นนี้ในตอนนี้ ขณะนี้ฉันอยู่ที่ git รุ่น 2.7.4 (Apple Git-66); ฉันไม่รู้ว่าฉันมีอะไรมาก่อน
hBrent

@ hBrent ยังคงใช้ได้กับฉันใน OSX 10.11 ด้วย git 2.7.3 นี่คือ repo ตัวอย่างรวดเร็วพร้อมคำแนะนำหากมีประโยชน์: github.com/jordan-brough/git-diff-test
Jordan Brough

ขอบคุณ @JordanBrough
hBrent

14

นอกจากนี้: git diff master..feature foo

เนื่องจากgit diff foo master:fooใช้งานไม่ได้กับไดเรกทอรีสำหรับฉัน


ฉันก็ไม่เหมือนกัน. มันเป็นสิ่งที่ Windows?
Scott Stafford

@ScottStafford ฉันใช้งาน Ubuntu ได้ไม่เลยดูเหมือนว่ามันจะไม่ใช่แค่ Windows เท่านั้น
ArtBIT

ทำงานให้ฉันตราบใดที่ฉันให้ชื่อสาขาทั้งสอง (windows) อย่างชัดเจน git diff branch1:foo master:foo
Meep

12
git difftool tag/branch filename

นี่เป็นคำตอบเดียวที่ทำงานกับฉันสำหรับการเปรียบเทียบระหว่างสำเนาการทำงานในเครื่องของไฟล์กับรุ่นของไฟล์นั้นใน repo ระยะไกล (ไม่ใช่ "Origin") ขอขอบคุณ Adir and Baz
Mouse

git difftoolไม่มี-vตัวเลือกตามเอกสารgit-scm.com/docs/git-difftool คุณหมายถึง-yอะไร
ks1322

10
git diff mybranch master -- file

ควรทำงานเช่นกัน


4
ใช้งานได้เฉพาะกับไฟล์ที่กำหนดให้ mybranch ไม่ใช่สำเนาการทำงานปัจจุบันของไฟล์
yoyo

"-" หมายถึงอะไรข้างต้น
Pushparaj

นี้จะช่วยให้เปรียบเทียบในทั้งสองทิศทาง: git diff deployment master -- fileและgit diff master deployment -- fileมีการทำงานตามที่คาดไว้กับ 2 สาขา
viktorkho

0

หากต้องการดูการเปลี่ยนแปลงในท้องถิ่นเปรียบเทียบกับสาขาปัจจุบันของคุณ

git diff .

หากต้องการดูการเปลี่ยนแปลงในท้องถิ่นเปรียบเทียบกับสาขาอื่นที่มีอยู่

git diff <branch-name> .

หากต้องการดูการเปลี่ยนแปลงของไฟล์เฉพาะ

git diff <branch-name> -- <file-path>

ตรวจสอบให้แน่ใจว่าคุณgit fetchเริ่มต้น

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