จะรับประวัติการกระทำเพียงสาขาเดียวได้อย่างไร?


129

สมมติว่าฉันสร้างสาขาใหม่my_experimentจาก masterและทำสัญญาหลายmy_experimentรายการ ถ้าฉันทำgit logเมื่อใดmy_experimentฉันจะเห็นการคอมมิตที่ทำกับสาขานี้ แต่ยังรวมถึงการคอมมิตmasterก่อนที่จะสร้างmy_experimentsสาขา

ฉันจะพบว่ามีประโยชน์มากในการดูประวัติของการกระทำทั้งหมดที่มีต่อmy_experimentsสาขาจนกว่ามันจะเข้าสู่การสร้างสาขานั้น - ประวัติศาสตร์ที่แท้จริงของสาขานั้นอย่างมีประสิทธิภาพ มิฉะนั้นฉันจะไม่ชัดเจนเมื่อดูบันทึกว่ามีการกระทำในmy_experimentsสาขาหรือไม่

มีวิธีดำเนินการกับ Git หรือไม่?

คำตอบ:


140

คุณสามารถใช้ช่วงเพื่อทำสิ่งนั้นได้

git log master..

หากคุณเคยตรวจสอบmy_experimentสาขาของคุณ สิ่งนี้จะเปรียบเทียบว่าmasterอยู่ที่ใดHEAD(ปลายmy_experiment)


3
ตกลงพูดเร็วเกินไป นั่นเป็นตัวอย่างง่ายๆของฉัน แต่ตอนนี้ฉันกำลังดู repo จริงของคนอื่นและเกิดขึ้นกับฉันว่าในการใช้คำสั่งนี้อย่างถูกต้องฉันจำเป็นต้องรู้ว่าสาขาปัจจุบันของฉันถูกสร้างขึ้นจากสาขาใด บางทีฉันควรจะสามารถบอกสิ่งนี้ได้จาก gitk แต่มันไม่ชัดเจนสำหรับฉัน ความคิดใด ๆ ?
Marplesoft

@Marplesoft มันอาจจะซับซ้อนในการคิดออก ดูคำถามนี้
alex

คุณช่วยอธิบายสั้น ๆ ได้ไหมว่ามันทำงานอย่างไร สิ่งที่ไม่git log master..บอก Git?
tonix

2
@tonix ไปที่ลิงค์ในคำตอบสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานของช่วง ( master..ส่วน)
alex

7

git merge-baseคำสั่งที่สามารถใช้ในการหาบรรพบุรุษร่วมกัน ดังนั้นหาก my_experiment ยังไม่ได้รวมเข้ากับ master และ my_experiment ถูกสร้างขึ้นจาก master คุณสามารถ:

git log --oneline `git merge-base my_experiment master`..my_experiment

หากคุณต้องการรวมพาเรนต์ของคอมมิตแรกของคุณให้เพิ่ม^และ- ผู้ปกครองคนแรก : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
Eric Lavoie

7

หมายเหตุ: หากคุณ จำกัด บันทึกนั้นไว้ที่ n คอมมิตสุดท้าย (เช่น 3 คอมมิตสุดท้ายเช่นคอมไพล์ล็อก -3) ให้ใส่ช่องว่างระหว่าง 'n' และสาขาของคุณ:

git log -3 master..

ก่อน Git 2.1 (สิงหาคม 2014) ข้อผิดพลาดนี้: git log -3master..จะแสดงให้คุณเห็นmy_experimentการคอมmasterมิต3 ครั้งสุดท้ายของสาขาปัจจุบัน (ที่นี่) โดยไม่สนใจขีด จำกัด (หมายความว่าหากmy_experimentมีการคอมมิตเพียงรายการเดียว 3 จะยังแสดงอยู่ 2 รายการจากmaster)

ดูการกระทำ e3fa568โดย Junio ​​C Hamano ( gitster) :

การแก้ไข: แยกวิเคราะห์ " git log -<count>" อย่างรอบคอบมากขึ้น

บรรทัดคำสั่งที่พิมพ์ผิดนี้จะละเว้น " master" และลงท้ายด้วยการแสดงสองคอมมิตจากปัจจุบันHEAD:

$ git log -2master

เนื่องจากเราป้อน " 2master" เป็นatoi()โดยไม่แน่ใจว่าสตริงทั้งหมดถูกแยกวิเคราะห์เป็นจำนวนเต็ม

ใช้strtol_i()ฟังก์ชันตัวช่วยแทน


1

คุณสามารถใช้ได้เฉพาะ git log --oneline


แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่การให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือเหตุผลในการแก้ปัญหาจะช่วยเพิ่มมูลค่าในระยะยาวของคำตอบ
DebanjanB

1

git log --online --decorateผมคิดว่าตัวเลือกสำหรับวัตถุประสงค์ของคุณคือ สิ่งนี้ช่วยให้คุณทราบถึงการกระทำที่ถูกตรวจสอบและคอมมิตสูงสุดสำหรับแต่ละสาขาที่คุณมีในเนื้อเรื่องของคุณ ด้วยการทำเช่นนี้คุณจะมีมุมมองที่ดีเกี่ยวกับโครงสร้างของ repo ของคุณและคอมมิตที่เกี่ยวข้องกับสาขาเฉพาะ ฉันคิดว่าการอ่านสิ่งนี้อาจช่วยได้


0

ฉันรู้ว่ามันสายไปแล้วสำหรับอันนี้ ... แต่นี่คือ oneliner (ไม่ง่ายนัก) เพื่อรับสิ่งที่คุณกำลังมองหา:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • เรากำลังแสดงรายการที่มีชื่อสาขาและตำแหน่งที่สัมพันธ์กับสถานะสาขาจริงพร้อมกับgit show-branch(ส่งคำเตือนไปที่/dev/null)
  • จากนั้นเราก็เพียง grep -E "\[$BRANCH_NAME"แต่ให้ผู้ที่มีชื่อสาขาของเราภายในวงเล็บด้วย
  • เมื่อ$BRANCH_NAMEได้รับจริงด้วยgit branch | grep -E '^\*' | awk '{ printf $2 }'(สาขาที่มีดาวสะท้อนโดยไม่มีดาวนั้น)
  • tail -n+2จากผลของเราเราเอาเส้นซ้ำซ้อนที่จุดเริ่มต้นด้วย
  • และจากนั้นเรา fianlly ทำความสะอาดเอาท์พุทโดยการเอาทุกอย่างก่อนหน้านี้ด้วย[$BRANCH_NAME]sed -E "s/^[^\[]*?\[/[/"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.