คำสองคำ: git bisect
ประวัติเชิงเส้นช่วยให้คุณสามารถระบุแหล่งที่มาที่แท้จริงของข้อบกพร่อง
ตัวอย่าง. นี่คือรหัสเริ่มต้นของเรา:
def bar(arg=None):
pass
def foo():
bar()
สาขา 1 ทำการปรับโครงสร้างบางอย่างซึ่งarg
ไม่สามารถใช้ได้อีกต่อไป
def bar():
pass
def foo():
bar()
สาขา 2 มีคุณสมบัติใหม่ที่จำเป็นต้องใช้arg
:
def bar(arg=None):
pass
def foo():
bar(arg=1)
จะไม่มีข้อขัดแย้งในการผสานอย่างไรก็ตามมีการแนะนำบั๊ก โชคดีที่อันนี้โดยเฉพาะจะถูกจับในขั้นตอนการรวบรวม แต่เราไม่โชคดีเสมอไป หากข้อผิดพลาดแสดงถึงพฤติกรรมที่ไม่คาดคิดแทนที่จะรวบรวมข้อผิดพลาดเราอาจไม่พบข้อผิดพลาดนั้นเป็นเวลาหนึ่งหรือสองสัปดาห์ ณ จุดนั้นgit bisect
เพื่อช่วยเหลือ!
โอ้อึ นี่คือสิ่งที่เห็น:
(master: green)
| \_________________________
| \ \
(master: green) (branch 1: green) (branch 2: green)
| | |
| | |
(master/merge commit: green) |
| ______________/
| /
(master/merge commit: red)
|
...days pass...
|
(master: red)
ดังนั้นเมื่อเราส่งออกgit bisect
ไปเพื่อค้นหาความมุ่งมั่นที่ทำให้งานสร้างพังลงไป นั่นช่วยได้เล็กน้อย แต่โดยพื้นฐานแล้วมันชี้ไปที่แพ็คเกจของการกระทำไม่ใช่อย่างเดียว บรรพบุรุษทุกคนมีสีเขียว ในทางกลับกันเมื่อมีการรีบูตคุณจะได้รับประวัติเชิงเส้น:
(master: green)
|
(master: green)
|
(all branch 1 commits: green)
|
(some branch 2 commits: green)
|
(branch 2 commit: red)
|
(remaining branch 2 commits: red)
|
...days pass...
|
(master: still red)
ตอนนี้git bisect
กำลังจะชี้ไปที่ฟีเจอร์ที่แน่นอนที่ใช้ในการสร้าง ตามหลักการแล้วข้อความยืนยันจะอธิบายสิ่งที่ตั้งใจไว้ดีพอที่จะทำ refactor อื่นและแก้ไขข้อผิดพลาดทันที
ผลกระทบจะรวมอยู่ในโครงการขนาดใหญ่เท่านั้นเมื่อผู้ดูแลไม่ได้เขียนรหัสทั้งหมดดังนั้นพวกเขาจึงไม่จำเป็นต้องจำไว้ว่าเหตุใดการกระทำที่ได้รับมอบหมาย / สิ่งที่แต่ละสาขามีไว้เพื่อ ดังนั้นการระบุการกระทำที่แน่นอน (และจากนั้นความสามารถในการตรวจสอบการกระทำรอบ ๆ ) เป็นความช่วยเหลือที่ดี
ที่กล่าวว่าฉัน (ปัจจุบัน) ยังคงชอบการรวม การรีบูตสาขาการปล่อยจะให้ประวัติเชิงเส้นของคุณสำหรับใช้กับgit bisect
ในขณะที่รักษาประวัติที่แท้จริงสำหรับการทำงานแบบวันต่อวัน