Git แตกต่างระหว่างสาขาปัจจุบันและหลัก แต่ไม่รวมถึงการไม่ผูกมัดปริญญาโท


171

ฉันต้องการความแตกต่างของการเปลี่ยนแปลงทั้งหมดในสาขาที่ยังไม่ได้รวมเข้ากับปริญญาโท

ฉันเหนื่อย:

git diff master
git diff branch..master
git diff branch...master

อย่างไรก็ตามในแต่ละกรณีเหล่านี้ diff มีเนื้อหาในต้นแบบที่ยังไม่ได้รวมเข้ากับสาขาของฉัน

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


9
ถ้าคุณพลิกเวอร์ชั่นที่สองคุณจะได้สิ่งที่ต้องการ: git diff master..branch. คุณสามารถย่อให้สั้นลงgit diff master..ถ้าคุณอยู่ในสาขา r1..r2ไวยากรณ์สั้นสำหรับ^r1 r2ซึ่งหมายถึง "แสดงให้ฉันทุกอย่างที่ลงมาจากr2และไม่สามารถเข้าถึงได้จากr1" git help gitrevisionsมีข้อมูลเกี่ยวกับไวยากรณ์ต่าง ๆ ที่คุณสามารถใช้ได้
John Szakmeister

1
ผมขยายคำตอบของฉันหลังจากที่ผมอ่านเพิ่มเติมเกี่ยวกับไวยากรณ์ของ... git diffความคิดเห็นของคุณเป็นสิ่งที่ผิด @jszakmeister เพราะช่วงการแก้ไขตามที่อธิบายในไม่มีอะไรจะทำอย่างไรกับgitrevisions git diffต่างเปรียบเทียบสองจุดในประวัติศาสตร์ไม่สามารถทำงานกับช่วง
Palec

คุณถูก. ฉันมักจะลืมที่git diffทำงานแตกต่างจากคำสั่งอื่น ๆ ... ความจริงที่ว่าฉันพบว่าน่าผิดหวัง :-(
John Szakmeister

ตรวจสอบให้แน่ใจว่าคุณอัพเดตสำเนาของโลคัลมาสเตอร์ก่อนเปรียบเทียบ
joe

คำตอบ:


232
git diff `git merge-base master branch`..branch

ฐานผสานเป็นจุดที่แยกออกมาจากbranchmaster

Git diff รองรับไวยากรณ์พิเศษสำหรับสิ่งนี้:

git diff master...branch

คุณต้องไม่สลับข้างเพราะคุณจะได้สาขาอื่น คุณต้องการที่จะรู้ว่าสิ่งที่เปลี่ยนแปลงไปในbranchเมื่อมันแยกออกจากกันmasterไม่ได้ในทางอื่น

เกี่ยวข้องอย่างหลวม:


โปรดทราบว่า..และ...ไวยากรณ์ไม่มีความหมายเดียวกันกับในเครื่องมือ Git อื่น ๆ man gitrevisionsมันแตกต่างจากความหมายที่ระบุไว้ใน

ข้อความman git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    <commit>นี่คือเพื่อดูการเปลี่ยนแปลงระหว่างสองโดยพลการ

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    สิ่งนี้มีความหมายเหมือนกับแบบฟอร์มก่อนหน้า หาก<commit>ละเว้นด้านหนึ่งจะมีผลเหมือนกับการใช้HEADแทน

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    แบบฟอร์มนี้เพื่อดูการเปลี่ยนแปลงในสาขาที่มีถึงสองเริ่มต้นที่มีบรรพบุรุษร่วมกันของทั้งสอง<commit> <commit>" git diff A...B" เทียบเท่ากับ " git diff $(git-merge-base A B) B" คุณสามารถละเว้นสิ่งใดสิ่งหนึ่ง<commit>ซึ่งมีผลเหมือนกับการใช้HEADแทน

ในกรณีที่คุณกำลังทำสิ่งแปลกใหม่ควรสังเกตว่า<commit>คำอธิบายทั้งหมดข้างต้นยกเว้นในสองรูปแบบสุดท้ายที่ใช้เครื่องหมาย ".. " อาจเป็น<tree>ได้

สำหรับรายการที่สมบูรณ์มากขึ้นของวิธีการที่จะสะกด<commit>ให้ดู "ระบุแก้ไขใน" gitrevisions[7]ในหัวข้อ อย่างไรก็ตาม "ต่าง" เป็นเรื่องเกี่ยวกับการเปรียบเทียบสองจุดสิ้นสุดไม่ได้ช่วงและเครื่องหมายช่วง ( " <commit>..<commit>'และ' <commit>...<commit>") ไม่ได้หมายถึงช่วงตามที่กำหนดไว้ในส่วน 'การระบุช่วง' gitrevisions[7]ในหัวข้อ


สำหรับฉันที่$ git diff master...branchผลิตfatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.- นี่เป็นคำสั่งที่ขึ้นอยู่กับรุ่นหรือไม่
Joel Peltonen

ที่จริงแล้วฉันเพิ่งรู้ว่า "สาขา" จะต้องเป็นชื่อของสาขาของคุณฉันคิดว่ามันเป็นการอ้างอิงถึงสาขาปัจจุบัน
Joel Peltonen

4
branchคุณมีสิทธิคำตอบของฉันอาศัยอยู่กับสาขาที่ถูกเรียกว่า ฉันเลือกที่จะยึดติดกับชื่อที่ OP เลือกไว้ในคำถาม หากคุณต้องการที่จะใช้สาขาในปัจจุบันแทนที่ด้วยbranch HEAD
Palec

14
โปรดทราบว่าคุณสามารถใช้git diff master...เพื่อหลีกเลี่ยงการระบุสาขา (จะถูกนำไปใช้ในปัจจุบัน)
VasiliNovikov

1
คำสั่งดั้งเดิมทำงานหลังจากที่คุณเช็คเอาdevelต์ @ChrisGuest หรือไม่ น่าจะเป็น Git สร้างสาขาให้คุณระหว่างการชำระเงินเป็นสำเนาภายในของสาขาระยะไกล (โดยทั่วไปorigin/devel) หากเป็นกรณีนี้git diff origin/devel...bugfix/API-353-api-allows-database-access-whenจะต้องใช้งานได้ก่อนที่จะชำระเงิน
Palec

44

นี่คือสิ่งที่ทำงานสำหรับฉัน:

git diff origin/master...

สิ่งนี้แสดงเฉพาะการเปลี่ยนแปลงระหว่างสาขาท้องถิ่นที่ฉันเลือกในปัจจุบันและสาขาต้นแบบระยะไกลและละเว้นการเปลี่ยนแปลงทั้งหมดในสาขาท้องถิ่นของฉันที่มาจากการรวมการกระทำ


สำหรับการอ้างอิงถ้าคุณจำเป็นต้องกระทำ refs git cherry origin/masterของกระทำที่มีการเปลี่ยนแปลงเหล่านี้ใช้
jaytibann

หากสิ่งนี้แสดงให้เห็นขยะจำนวนมากที่คุณไม่คาดคิดคุณmasterอาจลบล้างกลุ่มของคุณ
ไมเคิล - Clay Shirky อยู่ที่ไหน

21

ตามที่ระบุไว้โดย John Szakmeister และ VasiliNovikov คำสั่งที่สั้นที่สุดเพื่อให้ได้ความแตกต่างจากมุมมองของอาจารย์ในสาขาของคุณคือ:

git diff master...

สิ่งนี้ใช้สำเนาต้นแบบในเครื่องของคุณ

ในการเปรียบเทียบการใช้ไฟล์เฉพาะ:

git diff master... filepath

ตัวอย่างผลลัพธ์:

ตัวอย่างการใช้งาน

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