คำสั่งเชลล์ต่อไปนี้ควรทำสิ่งที่คุณต้องการ:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
คำเตือน
หากคุณชำระเงินmybranchแล้วคำสั่งด้านบนจะไม่ทำงาน นั่นเพราะกระทำในmybranchนอกจากนี้ยังสามารถเข้าถึงได้โดยHEADเพื่อ Git mybranchไม่พิจารณากระทำที่จะไม่ซ้ำกับ หากต้องการให้มันทำงานเมื่อmybranchมีการชำระเงินคุณต้องเพิ่มการยกเว้นสำหรับHEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
อย่างไรก็ตามคุณควรไม่ยกเว้นHEADเว้นแต่มีการตรวจสอบออกมิฉะนั้นคุณมีความเสี่ยงการแสดงกระทำที่ไม่ได้mybranch จำกัด เฉพาะmybranch
ในทำนองเดียวกันหากคุณมีสาขาระยะไกลที่มีชื่อorigin/mybranchตรงกับmybranchสาขาในพื้นที่คุณจะต้องยกเว้น:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
และหากสาขาระยะไกลเป็นสาขาเริ่มต้นสำหรับพื้นที่เก็บข้อมูลระยะไกล (มักจะเป็นจริงเท่านั้นorigin/master) คุณจะต้องยกเว้นorigin/HEADเช่นกัน:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
หากคุณมีสาขาที่เช็คเอาท์และมีสาขาระยะไกลและสาขาระยะไกลเป็นค่าเริ่มต้นสำหรับพื้นที่เก็บข้อมูลระยะไกลแล้วคุณจะสิ้นสุดการยกเว้นมาก
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
คำอธิบาย
git rev-listคำสั่งเป็นคำสั่งที่ระดับต่ำ (ประปา) ที่เดินเนื้อเรื่องที่กำหนดและทิ้งตัวระบุ SHA1 ที่พบ คิดว่ามันเทียบเท่ากับgit logยกเว้นมันจะแสดงเฉพาะ SHA1 - ไม่มีข้อความบันทึกไม่มีชื่อผู้แต่งไม่มีการประทับเวลาไม่มีสิ่งที่ "แฟนซี"
--no-walkตัวเลือกเป็นชื่อที่แสดงถึงป้องกันgit rev-listจากการเดินห่วงโซ่บรรพบุรุษ ดังนั้นหากคุณพิมพ์git rev-list --no-walk mybranchมันจะพิมพ์ตัวระบุ SHA1 เพียงตัวเดียวนั่นคือตัวระบุคำแนะนำการกระทำของmybranchสาขา
--exclude=refs/heads/mybranch --allข้อโต้แย้งบอกเริ่มต้นจากการอ้างอิงในแต่ละยกเว้นgit rev-listrefs/heads/mybranch
ดังนั้นเมื่อคุณทำงานgit rev-list --no-walk --exclude=refs/heads/mybranch --all, Git พิมพ์ระบุ SHA1 refs/heads/mybranchของปลายกระทำของแต่ละยกเว้นโทษ การกระทำเหล่านี้และบรรพบุรุษของพวกเขาคือการกระทำที่คุณไม่สนใจ - สิ่งเหล่านี้เป็นการกระทำที่คุณไม่ต้องการเห็น
ความมุ่งมั่นอื่น ๆคือสิ่งที่คุณต้องการเห็นดังนั้นเราจึงรวบรวมเอาพุตgit rev-list --no-walk --exclude=refs/heads/mybranch --allและบอก Git ให้แสดงทุกอย่างยกเว้นสิ่งที่พวกเขาทำและบรรพบุรุษ
--no-walkอาร์กิวเมนต์เป็นสิ่งจำเป็นสำหรับการเก็บขนาดใหญ่ (และเป็นการเพิ่มประสิทธิภาพสำหรับเก็บเล็ก): ก็ไม่มี Git จะมีการพิมพ์และเปลือกจะมีการเก็บรวบรวม (และเก็บไว้ในหน่วยความจำ) อื่น ๆ อีกมากมายกระทำตัวระบุเกินความจำเป็น ด้วยที่เก็บขนาดใหญ่จำนวนการคอมมิตที่รวบรวมได้อาจเกินขีด จำกัด อาร์กิวเมนต์บรรทัดคำสั่งของเชลล์ได้อย่างง่ายดาย
Git bug?
ฉันคาดว่าจะได้งานต่อไปนี้:
git log --all --not --exclude=refs/heads/mybranch --all
แต่มันไม่ได้ ฉันเดาว่านี่เป็นข้อผิดพลาดใน Git แต่บางทีมันอาจเป็นการจงใจ