ฉันจะ 'git diff' บนไดเร็กทอรีบางไดเร็กทอรีได้อย่างไร


132

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


2
stackoverflow.com/a/12123669/1815624 git diff master..yourbranch path/to/folder
CrandellWS

คำตอบ:


126

ระบุเส้นทาง (myfolder ในกรณีนี้) และเรียกใช้:

git diff myfolder/

28
ฉันต้องการใช้git diff -- myfolderเพื่อลดความกำกวมในการคอมไพล์ สัญกรณ์ทั่วไปสำหรับ git diff (และคำสั่ง git หลายคำสั่ง) คือgit diff [commit-ish] -- [path]โดยที่ค่าเริ่มต้นของการกระทำคือHEAD (ที่คุณอยู่ในขณะนี้) และเป็น[path]ค่าเริ่มต้นของไดเร็กทอรี git root แต่สามารถเป็นอะไรก็ได้ที่สัมพันธ์กับไดเร็กทอรีปัจจุบันของคุณ โดยไม่ต้อง--, คอมไพล์จะคาดเดาสิ่งที่คุณหมายถึงหรือ[commit-ish] [path]ในบางกรณีสิ่งนี้ทำให้คอมไพล์บอกว่าสัญกรณ์ 'ไม่ชัดเจน' ถ้าจำไม่ผิด.
L0LN1NJ4

2
สิ่งนี้ไม่พิมพ์อะไรเลยเมื่อฉันลองใช้วิธีการในคำตอบและวิธีการในความคิดเห็น
ray

@ray ซึ่งหมายความว่าคุณไม่มีความแตกต่างระหว่างโครงสร้างการทำงานและการกระทำล่าสุด
valerij vasilcenko

3
สำหรับ @ray และบุคคลในอนาคตที่เห็นสิ่งนี้คุณสามารถรวมสาขาที่คุณพยายามที่จะแตกต่างกันgit diff master..develop myfolder/ตามที่ @CrandellWS กล่าวไว้ในความคิดเห็นของคำถามเดิม สถานะ Git จะแสดงการเปลี่ยนแปลงหากนั่นคือสิ่งที่คุณกำลังมองหา
BVBA เร่ง

2
@ray ตรวจสอบให้แน่ใจว่าคุณอยู่ที่ไดเรกทอรีราก เส้นทางจะสัมพันธ์กับไดเร็กทอรีปัจจุบันของคุณ
Nickofthyme

59

หากคุณกำลังเปรียบเทียบสาขาต่างๆคุณจำเป็นต้องใช้--เพื่อแยกการแก้ไข Git ออกจากเส้นทางระบบไฟล์ ตัวอย่างเช่นมีสาขาในท้องถิ่นสองสาขาmasterและbryan-working:

$ git diff master -- AFolderOfCode/ bryan-working -- AFolderOfCode/

หรือจากสาขาในพื้นที่ไปยังรีโมต:

$ git diff master -- AFolderOfCode/ origin/master -- AFolderOfCode/

29
ต้องการเพียงข้อเดียวเท่านั้นหลังจากแสดงรายการทั้งสองสาขาเช่นใน: git diff branch1 branch2 - path / to / dir
Emery

4

คุณควรสร้างนิสัยในการดูเอกสารสำหรับสิ่งต่างๆเช่นนี้ มันมีประโยชน์มากและจะพัฒนาทักษะของคุณได้อย่างรวดเร็ว นี่คือบิตที่เกี่ยวข้องเมื่อคุณทำgit help diff

   git diff [options] [--no-index] [--] <path> <path>

สอง<path>สิ่งนี้คือสิ่งที่คุณต้องเปลี่ยนเป็นไดเรกทอรีที่มีปัญหา


3

เพิ่มBeyond Compareเป็น difftool ของคุณใน Git และเพิ่มนามแฝงสำหรับ diffdir เป็น:

git config --global alias.diffdir = "difftool --dir-diff --tool=bc3 --no-prompt"

รับ gitdiff เป็น:

git diffdir 4bc7ba80edf6  7f566710c7

การอ้างอิง: เปรียบเทียบไดเรกทอรีทั้งหมดด้วย git difftool + Beyond Compare


1
เครื่องหมายเท่ากับจะผิดสำหรับ git 2.17.1 ใช้git config --global alias.diffdir = "difftool --dir-diff --tool=bc3 --no-prompt"แทน
Mark Schäfer

โปรดทราบว่าเมื่อใช้ Beyond Compare สำหรับ dir diff คุณต้องกำหนดค่าให้เป็นไปตาม symlinks (ในมุมมองเปรียบเทียบโฟลเดอร์ -> กฎ (ไอคอนผู้ตัดสิน) -> การจัดการ -> ติดตาม symlinks) หรือเพิ่ม--no-symlinksตัวเลือกเพื่อให้คำสั่งอ่านgit difftool --dir-diff --no-symlinks
Ashutosh Jindal

1

ไม่เพียง แต่คุณสามารถเพิ่มเส้นทาง แต่คุณสามารถเพิ่มgit diff --relativeเพื่อรับผลลัพธ์ที่สัมพันธ์กับโฟลเดอร์นั้นได้

git -C a/folder diff --relative

และด้วย Git 2.28 (ไตรมาสที่ 3 ปี 2020) คำสั่งในตระกูล " diff" ได้เรียนรู้ที่จะให้เกียรติdiff.relativeตัวแปรการกำหนดค่า ""

ดูกระทำ c28ded8 (22 พฤษภาคม 2020) โดยLaurent Arnoud (spk )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ e34df9a , 2 มิถุนายน 2020)

diff: เพิ่มตัวเลือกการกำหนดค่า relative

ลงนามโดย: Laurent Arnoud
ติดตามโดย: ĐoànTrầnCông Danh

diff.relativeชุดตัวเลือกแบบบูลที่จะtrueแสดงให้เห็นเพียงการเปลี่ยนแปลงในปัจจุบันไดเรกทอรี / ค่าที่ระบุไว้ในpathข้อโต้แย้งของrelativeตัวเลือกและการแสดง pathnames เทียบกับไดเรกทอรีดังกล่าวข้างต้น

สอน--no-relativeการลบล้างก่อนหน้านี้--relative

เพิ่มสำหรับเอกสารประกอบตัวเลือก git-format-patch (1) --relativeและ--no-relative

เอกสารขณะนี้รวมถึง :

diff.relative:

หากตั้งค่าเป็น ' true' ' git diff' จะไม่แสดงการเปลี่ยนแปลงภายนอกไดเร็กทอรีและแสดงชื่อพา ธ ที่สัมพันธ์กับไดเร็กทอรีปัจจุบัน


0

หากคุณต้องการยกเว้นไดเรกทอรีย่อยคุณสามารถใช้ไฟล์

git diff <ref1>..<ref2> -- $(git diff <ref1>..<ref2> --name-only | grep -v /)

0

ในการใช้Beyond Compareเป็น difftool สำหรับไดเร็กทอรี diff อย่าลืมเปิดใช้งานลิงก์สัญลักษณ์ดังนี้:

ในโฟลเดอร์เปรียบเทียบดูกฎ (ไอคอนผู้ตัดสิน):

ใส่คำอธิบายภาพที่นี่

จากนั้นเปิดใช้งานตามลิงค์สัญลักษณ์และอัปเดตค่าเริ่มต้นของเซสชัน:

ใส่คำอธิบายภาพที่นี่


หรือ,

ตั้งนามแฝงดังนี้:

git config --global alias.diffdir "difftool --dir-diff --tool=bc3 --no-prompt --no-symlinks"

โปรดทราบว่าไม่ว่าในกรณีใดการแก้ไขใด ๆ ที่ทำทางด้านข้าง (ซ้ายหรือขวา) ที่อ้างถึงโครงสร้างการทำงานปัจจุบันจะถูกเก็บรักษาไว้

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