วิธีการแตกต่างระหว่างการเปลี่ยนแปลงที่ไม่เกิดกับท้องถิ่นและที่มา


141

สมมติว่าฉันโคลนที่เก็บและเริ่มแก้ไขไฟล์ ฉันรู้ว่าถ้าฉันมีการเปลี่ยนแปลงในท้องถิ่นที่ไม่มีข้อผูกมัดฉันสามารถทำ diff ต่าง ๆ ดังต่อไปนี้git diff test.txtและมันจะแสดงความแตกต่างระหว่าง HEAD ในปัจจุบันกับการเปลี่ยนแปลงที่ไม่มีการดัดแปลงในไฟล์ หากฉันยอมรับการเปลี่ยนแปลงเหล่านั้นฉันสามารถทำให้แตกต่างกับที่เก็บต้นฉบับโดยใช้git diff master origin/master

แต่มีวิธีใดบ้างในการกระจายการเปลี่ยนแปลงในพื้นที่ด้วยที่เก็บต้นฉบับบนเซิร์ฟเวอร์ก่อนที่จะส่งข้อมูลภายใน ฉันลองใช้วิธีเรียงสับเปลี่ยนgit diff --cached master origin/masterโดยไม่มีโชค


ฉันต้องการที่จะรู้ว่าไฟล์ของฉันมีการเปลี่ยนแปลงจากรุ่นมุ่งมั่นล่าสุดในท้องถิ่นของฉัน คำตอบสำหรับคำถามของฉันคือคำถามนี้ ขอบคุณ!
Souvik Ghosh

คำตอบ:


133

ระบุว่าพื้นที่เก็บข้อมูลระยะไกลได้รับการแคชผ่านgit fetchมันควรจะเป็นไปได้ที่จะเปรียบเทียบกับกระทำเหล่านี้ ลองทำสิ่งต่อไปนี้:

$ git fetch origin
$ git diff origin/master

5
อ่าเยี่ยมมาก กุญแจสำคัญคือการปล่อยให้เจ้านายออกไป ฉันเคยลองชุดที่ฉันเคยทำมาก่อน แต่เมื่อฉันทำgit diff master origin/masterมันก็ยังคงเปรียบเทียบกับรุ่นมุ่งมั่น (ชัดเจนในการหวนกลับ) แต่การละทิ้งเจ้านายจะเปรียบเทียบการเปลี่ยนแปลงในท้องถิ่นกับเวอร์ชันที่ดึงมา
Chaitanya

@ Chaitanya ดีฉันสามารถช่วย อันที่จริงผมพบสไตล์ที่แตกต่าง Git ใช้ระคายเคืองบิต: เมื่อคุณต้องเขียนและที่อื่นorigin master origin/masterยังมีงานต้องทำ IMHO
JJD

สิ่งนี้ดูเหมือนจะไม่ทำงาน: มีต้นแบบการgit diff origin/masterคืนค่าfatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.อยู่บนจุดเริ่มต้นเช่นgit fetch origin masterทำงานได้ดี
mikemaccana

42

ฉันรู้ว่ามันไม่ใช่คำตอบสำหรับคำถามที่ถูกถาม แต่ฉันพบคำถามนี้ที่ต้องการกระจายไฟล์ในสาขาและไฟล์ที่ไม่มีข้อผูกมัดในท้องถิ่นและฉันคิดว่าฉันจะแชร์

ไวยากรณ์:

git diff <commit-ish>:./ -- <path>

ตัวอย่าง:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(ขอบคุณ Eric Boehs สำหรับวิธีที่ไม่ต้องพิมพ์ชื่อไฟล์สองครั้ง)


ฉันชอบวิธีการแก้ปัญหาทั่วไปดีกว่าแบบแคบที่เฉพาะเจาะจงด้านบน แบ่งปันความคิดที่คุณพบว่า?
fbicknel

ฉันไม่สามารถหาเอกสารเกี่ยวกับรายละเอียดcommit-ishและตัวคั่นลำไส้ใหญ่ได้ เอกสารเกี่ยวกับgit-diffดูเหมือนจะไม่พูดถึงมัน ฉันใช้มันมานานจนจำไม่ได้ว่าเจอที่ไหนก่อน อื่น ๆ ที่น่าจะเป็นตัวอย่างของผู้คนในคำสั่งอื่น ๆ git-diffและฉันก็ทดลองกับ ฉันเกรงว่าคำตอบอีกข้อcommit-ishคือสิ่งที่ดีที่สุดที่ฉันสามารถหาได้ในตอนนี้
เนท

3
git diff master:./ -- README.mdยังดีที่นี้คือ ด้วยวิธีนี้คุณไม่ต้องพิมพ์README.mdสองครั้งและคุณสามารถเพิ่มลงในนามแฝงได้ง่ายขึ้น
Eric Boehs

ขอบคุณ @EricBoehs นั่นเป็นคำแนะนำที่ยอดเยี่ยม
เนท

1
นั่นไวยากรณ์ไม่ทำงานสำหรับฉัน ... ค่อนข้างสร้างแหล่งที่มามากกว่าสาขาที่ห่างไกล ใช้ git เวอร์ชั่น 2.19.0git diff master: -- README.md.//dev/null
rustyDev

21

หากต้องการดูการเปลี่ยนแปลงที่ไม่ใช่ระยะ (ไม่เพิ่ม) ไฟล์ที่มีอยู่

git diff

โปรดทราบว่านี่จะไม่ติดตามไฟล์ใหม่ หากต้องการดูการเปลี่ยนแปลงที่จัดเป็นระยะไม่ใช่ข้อผูกพัน

git diff --cached


9

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

git difftool

มันจะเริ่มต้นแอพ diff ของคุณโดยอัตโนมัติสำหรับไฟล์ที่เปลี่ยนแปลงแต่ละไฟล์

PS: หากคุณไม่ได้ตั้งแอพ diff คุณสามารถทำได้เหมือนในตัวอย่างด้านล่าง (ฉันใช้Winmerge ):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false

การเปลี่ยนแปลงนี้จะมีผลทันทีหรือไม่
Dilip Raghunathan

ฉันแค่อยากรู้อยากเห็นคำถามนี้เกี่ยวข้องกับคำถามที่ถามอย่างไร จะไม่คอมไพล์ooltoolเพียงเปรียบเทียบการเปลี่ยนแปลงในท้องถิ่นกับต้นแบบหรือไม่ อย่างไรก็ตาม OP ต้องการระหว่างการเปลี่ยนแปลงโลคัลและต้นแบบระยะไกล
infoclogged

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