จำเป็นหรือไม่ที่จะต้องทำงานกับบั๊กหลายตัวในครั้งเดียว และโดย "พร้อมกัน" ฉันหมายถึง "การแก้ไขไฟล์สำหรับข้อบกพร่องหลายรายการในเวลาเดียวกัน" เพราะหากคุณไม่ต้องการสิ่งนั้นจริงๆฉันจะทำงานกับบั๊กเพียงครั้งเดียวในสภาพแวดล้อมของคุณ ด้วยวิธีนี้คุณสามารถใช้สาขาในท้องถิ่น & การคืนเงินซึ่งฉันพบได้ง่ายกว่าการจัดการที่ซับซ้อน / เวที
สมมติว่า master กำลังทำงาน B ตอนนี้ทำงานกับ bug # 1
git checkout -b bug1
ตอนนี้คุณอยู่ที่สาขา bug1 ทำการเปลี่ยนแปลงคอมมิทชั่นรอการตรวจสอบโค้ด นี่คือท้องถิ่นดังนั้นคุณจะไม่ส่งผลกระทบต่อคนอื่นและควรง่ายพอที่จะทำให้แพทช์จากคอมไพล์ต่าง
A-B < master
\
C < bug1
ตอนนี้คุณกำลังทำงานกับ bug2 ไปกลับgit checkout master
ไปต้นแบบที่มี สร้างสาขาใหม่git checkout -b bug2
. ทำการเปลี่ยนแปลงคอมมิชชันรอการตรวจทานโค้ด
D < bug2
/
A-B < master
\
C < bug1
มาทำท่าว่าคนอื่นจะยอมรับ E&F กับนายขณะที่คุณรอการทบทวนอยู่
D < bug2
/
A-B-E-F < master
\
C < bug1
เมื่อรหัสของคุณได้รับการอนุมัติคุณสามารถรีบูตมันเป็นหลักได้ด้วยขั้นตอนต่อไปนี้:
git checkout bug1
git rebase master
git checkout master
git merge bug1
สิ่งนี้จะส่งผลให้:
D < bug2
/
A-B-E-F-C' < master, bug1
จากนั้นคุณสามารถผลักดันลบสาขาบั๊กในเครื่องของคุณและออกไป บั๊กหนึ่งครั้งในเวิร์กสเปซของคุณ แต่ด้วยการใช้สาขาท้องถิ่นที่เก็บของคุณสามารถจัดการบั๊กได้หลายตัว และนี่เป็นการหลีกเลี่ยงการเต้นบนเวที / การสะสมที่ซับซ้อน
ตอบคำถามของ ctote ในความคิดเห็น:
คุณสามารถกลับไปที่ stashing สำหรับแต่ละข้อบกพร่องและทำงานกับหนึ่งครั้งเท่านั้น อย่างน้อยที่ช่วยให้คุณประหยัดปัญหาการแสดงละคร แต่หลังจากได้ลองสิ่งนี้ฉันพบว่ามันลำบาก การหยุดทำงานจะยุ่งเล็กน้อยในกราฟบันทึกการคอมไพล์ และที่สำคัญถ้าคุณทำอะไรผิดพลาดขึ้นคุณจะไม่สามารถย้อนกลับได้ หากคุณมีไดเรกทอรีทำงานที่สกปรกและคุณซ่อนที่เก็บไว้คุณจะไม่สามารถ "เลิกทำ" ที่ปรากฏขึ้นมาได้ มันยากมากที่จะทำให้หมดความมุ่งมั่นที่มีอยู่แล้ว
git rebase -i
ดังนั้น
เมื่อคุณรีบูตสาขาหนึ่งไปยังสาขาอื่นคุณสามารถทำแบบโต้ตอบได้ (แฟล็ก -i) เมื่อคุณทำเช่นนี้คุณมีตัวเลือกในการเลือกสิ่งที่คุณต้องการจะทำกับแต่ละการกระทำ Pro Git เป็นหนังสือที่ยอดเยี่ยมซึ่งยังออนไลน์อยู่ในรูปแบบ HTML และมีส่วนที่ดีในการรีบูท & squashing:
http://git-scm.com/book/ch6-4.html
ฉันจะขโมยตัวอย่างคำต่อคำของพวกเขาเพื่อความสะดวก แกล้งทำเป็นว่าคุณมีประวัติการกระทำดังต่อไปนี้และคุณต้องการที่จะ rebase & squash bug1 ไปยังมาสเตอร์:
F < bug2
/
A-B-G-H < master
\
C-D-E < bug1
นี่คือสิ่งที่คุณจะเห็นเมื่อคุณพิมพ์ git rebase -i master bug1
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
หากต้องการสควอชคอมมิชชันของสาขาลงไปในการคอมมิชชันเดียวให้คอมมิตแรกเป็น "เลือก" และแทนที่รายการ "เลือก" ที่ตามมาทั้งหมดด้วย "สควอช" หรือเพียงแค่ "s" คุณจะได้รับโอกาสในการเปลี่ยนแปลงข้อความยืนยันเช่นกัน
pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
ดังนั้นการบีบเป็นความเจ็บปวดเล็กน้อย แต่ฉันยังคงแนะนำให้ใช้อย่างหนัก