การแยกความคืบหน้าการเข้ารหัสให้เป็นความมุ่งมั่นที่มีความหมายโดยไม่มีค่าใช้จ่ายมากเกินไป


23

เมื่อทำงานกับการแก้ไขหรือคุณสมบัติบางครั้งฉันสะดุดปัญหาเล็ก ๆ อื่น ๆ ที่สามารถปรับปรุงได้ทันทีในไม่กี่วินาที เมื่อฉันทำพวกเขาทันทีจากนั้นส่งมอบคุณสมบัติ / แก้ไขที่เสร็จสิ้นแล้วคอมมิชชันมีมากกว่าหนึ่งสิ่ง ยกตัวอย่างเช่นหรือ"add feature X and code clean up" "fix bug X and improved logging"มันจะเป็นการดีกว่าถ้าคุณแยกมันออกเป็นสองคอมมิชชัน ในกรณีที่การเปลี่ยนแปลงสองอย่างเกิดขึ้นในไฟล์เดียวกันฉันไม่สามารถเพิ่มไฟล์เดียวคอมมิทเพิ่มและอีกครั้ง ดังนั้นฉันเห็นสามตัวเลือกต่อไปนี้:

  1. จงใจมองข้ามสิ่งที่ไม่เกี่ยวข้องขณะทำงานกับบางสิ่ง

  2. คัดลอกไฟล์ที่มีการเปลี่ยนแปลงสองรายการย้อนกลับรวมการเปลี่ยนแปลงหนึ่งกระทำรวมถึงการเปลี่ยนแปลงอื่นกระทำอีกครั้ง

  3. อย่าเปลี่ยนสิ่งเล็ก ๆ ที่ไม่เกี่ยวข้อง แต่เพิ่มไปยังรายการสิ่งที่ต้องทำและทำในภายหลัง

ฉันไม่ชอบทั้งสามตัวเลือกเพราะเหตุผลดังต่อไปนี้:

  1. คุณภาพของรหัสอาจประสบได้หากไม่สามารถแก้ไขปัญหาเล็ก ๆ ได้ และฉันก็รู้สึกไม่ดีถ้าฉันพลาดโอกาสที่จะปรับปรุงบางสิ่งโดยไม่ต้องใช้ความพยายามมาก

  2. นี่เป็นการเพิ่มการทำงานด้วยตนเองและเกิดข้อผิดพลาดได้ง่าย

  3. นี่เป็นสิ่งที่ดีสำหรับโทโดที่ไม่ได้เล็ก แต่เพิ่มไอเท็มเล็ก ๆ ลงในรายการสิ่งที่ต้องทำและกลับมาอีกครั้งในภายหลังมักใช้เวลานานกว่าการแก้ไขทันที

คุณจัดการกับสถานการณ์เช่นนี้ได้อย่างไร?


7
ไม่คอมไพล์อนุญาตให้คุณตรวจสอบในแต่ละบรรทัดมากกว่าไฟล์ทั้งหมดหรือไม่
Kilian Foth

ความซ้ำซ้อนที่เป็นไปได้ของการกระทำสามารถถือว่าเล็กเกินไปหรือไม่
ริ้น

ฉันใช้git add -pมากซึ่งช่วยให้ฉันสามารถเลือกส่วนต่าง ๆ ของไฟล์ที่ฉันต้องการมอบหมาย หากการทำความสะอาดแยกออกจากกันอย่างเพียงพอนี่เป็นเรื่องง่ายที่จะทำ ถ้าการแยกยากขึ้นฉันยอมรับสถานะในสาขาชั่วคราวจากนั้นเพิ่มการเปลี่ยนแปลงในสาขาจริงของฉันด้วยตนเองจนกว่าจะไม่มีความแตกต่างกับสาขาชั่วคราว มันต้องใช้งานมากขึ้น แต่อนุญาตให้ฉันตรวจสอบว่าการกระทำแต่ละอย่างทำงานด้วยตัวเอง
amon

1
@gnat: เห็นได้ชัดว่าไม่ใช่ล่อลวง OP ไม่ได้ถามถึงขนาดที่ถูกต้องของการกระทำ - เขาต้องการทำสิ่งเล็ก ๆ เขาแค่มองหาวิธีที่มีประสิทธิภาพมากกว่านี้
Doc Brown

2
@gnat: คำตอบยอดนิยมไม่มีอะไรเกี่ยวกับวิธีจัดการกับการเปลี่ยนแปลงที่แตกต่างกันในไฟล์เดียวและวิธีแยกพวกเขาออกเป็นคอมมิชชันแยกต่างหาก
Doc Brown

คำตอบ:


11

ฉันคิดว่าคุณต้องจริงจังในการเขียนโปรแกรม แม้ว่ามันอาจเป็นไปได้ที่จะกำหนดรูปแบบที่สมบูรณ์แบบเวิร์กโฟลว์หรือการใช้งานบางครั้งคุณก็ต้องทำงานให้เสร็จ นี่คือสิ่งที่ฉันทำ:

ฉันใช้ความสามารถของคอมไพล์ในการจัดเวที / คอมมิชชันล่าสัตว์และแต่ละบรรทัด (ถ้าเป็นไปได้) เพื่อแยกการเปลี่ยนแปลงที่ไม่เกี่ยวข้องแม้ว่าบางครั้งสิ่งนี้สามารถแนะนำปัญหาชั่วคราวได้หากการแยกไม่ได้ทำอย่างถูกต้อง เนื่องจากการเปลี่ยนแปลงจะอยู่ติดกันจึงไม่ใช่ปัญหาใหญ่เว้นแต่คุณจะมีนโยบายทดสอบการเปลี่ยนแปลงแต่ละอย่างใน CI ไปป์ไลน์ของคุณ

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

มันเกิดขึ้นที่มันไม่เชิงแยกสิ่งต่าง ๆ และฉันจะกระทำการปรับเล็กน้อยพร้อมกับงานต้นฉบับ

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


7

โปรแกรมแก้ไขของฉันมีปลั๊กอินที่ทำให้การแสดงละครแต่ละส่วนของไฟล์เป็นเรื่องง่ายมาก ฉันคิดว่าผู้แก้ไขโปรแกรมเมอร์คนอื่นอาจมีปลั๊กอินที่คล้ายกันถึงแม้ว่าคุณจะสามารถทำได้ด้วยตัวgit add --patch | -pเอง จากนั้นฉันใช้git stashเพื่อบันทึกการเปลี่ยนแปลงอื่น ๆ ของฉันเพื่อทดสอบการกระทำเล็ก ๆ ของฉัน หลังจากนั้นฉันก็ลงมือทำgit stash popและทำต่อไป นั่นคือสิ่งที่คุณสมบัติเหล่านั้นถูกออกแบบมาเพื่อ


2

เคล็ดลับคือไม่ทำการเปลี่ยนแปลงจนกว่าคุณจะพร้อมที่จะใช้ความพยายามมากพอ ๆ กับการเปลี่ยนแปลงที่สมควรได้รับ

สิ่งที่ฉันมักจะทำคือเพิ่มลงในรายการสิ่งที่ต้องทำ (บางครั้งโดยการเพิ่มความคิดเห็นไปยังโค้ดบางครั้งในบันทึกย่อในตั๋วข้อผิดพลาดและบางครั้งโดยการอัปเดตรหัสในสาขาแยกต่างหาก หากไม่มีข้อผิดพลาดตั๋วสำหรับการสะสมของปัญหาคุณภาพเล็กน้อยฉันยกหนึ่งโดยเฉพาะสำหรับเรื่องนี้ดังนั้นฉันและคนอื่น ๆ สามารถบอกได้ว่าสาเหตุของการเปลี่ยนแปลงรหัสเหล่านั้นคือเมื่อสาขาได้รับการผสาน ฉันไม่เคยแค่ทำการเปลี่ยนแปลงเพื่อความสนุกของมันทุกอย่างได้รับการตรวจสอบย้อนกลับดังนั้นเพื่อนร่วมงานของฉันจะไม่แปลกใจเกินไปเมื่อมีการเปลี่ยนแปลงรหัส

ดังนั้นในระยะสั้น - ใช่มองข้ามพวกเขาเมื่อการเข้ารหัส หากคุณกำลังเพิ่มคุณสมบัติอย่าถูกล่อลวงให้เพิ่ม 2 คุณสมบัติไม่ว่าจะเล็กเพียงใด หากมีคนตัดสินใจที่จะคืนค่าสาขาของคุณ (เพราะคุณสมบัติของคุณไม่จำเป็นต้องพูดอีกต่อไป) จากนั้นคุณจะสูญเสีย mini-bugfix ทั้งหมด ในทำนองเดียวกันคุณไม่ต้องการให้ 'แก้ไข' เล็ก ๆ ในรหัสที่สำคัญบางอย่างที่ทำงานอย่างถูกต้อง


1
OP ไม่ได้แนะนำให้รวมการเปลี่ยนแปลงสองอย่างเข้าด้วยกันในการคอมมิทค่อนข้างตรงกันข้าม
Doc Brown

1
@DocBrown เขาแนะนำให้รวม 2 การเปลี่ยนแปลงเข้าด้วยกันในสาขาเดียวซึ่งอาจยุ่งเหยิงที่จะแก้ในภายหลังแม้ว่าจะเห็นได้ชัดว่าไม่ยุ่งเหยิงเหมือนกับการเปลี่ยนแปลง 2 อย่างในการกระทำเดียว
gbjbaanb

ตกลงฉันเห็นสิ่งที่คุณมีในใจกับย่อหน้าสุดท้ายของคุณ
Doc Brown

2

ตัวเลือกที่ฉันใช้ไม่น้อยคือการเพิ่มTODOความคิดเห็นจากนั้นทำข้อตกลง "บางส่วน" บ่อยๆโดยใช้git add --patchเพื่อเลือกส่วนที่เกี่ยวข้องของไฟล์ จากนั้นใช้git rebase --interactiveเพื่อจัดลำดับใหม่และผสานการคอมมิตบางส่วนในฟีเจอร์สุดท้ายและการคอมมิท fixup ก่อนที่จะพุช

สิ่งนี้จะช่วยรักษาความมุ่งมั่นหลักของคุณและยังช่วยให้คุณสามารถแก้ไขปัญหาอื่น ๆ ที่คุณพบได้ทันที

git rebaseในบริบทนี้ไม่มีอะไรผิดเนื่องจากคุณเขียนเฉพาะการกระทำในท้องถิ่น


1

ตัวเลือกอื่นอาจเป็น "git stash" การเปลี่ยนแปลงปัจจุบันของคุณ เวิร์กโฟลว์จะมีลักษณะดังนี้:

  1. เริ่มทำการเปลี่ยนแปลงที่เกี่ยวข้องกับคุณสมบัติ A
  2. ค้นพบBug Bและตัดสินใจที่จะแก้ไขทันที
  3. จากบรรทัดคำสั่งในการทำธุรกรรมซื้อคืนของคุณgit stash (หลังจากนั้นรหัสของคุณจะกลับสู่สถานะเดิมก่อนที่คุณจะเริ่มทำงานกับคุณสมบัติ A )
  4. ณ จุดนี้การเปลี่ยนแปลงที่ไม่ผูกมัดของคุณสำหรับคุณสมบัติ Aจะถูกเก็บไว้ใน "ที่เก็บของ"
  5. ทำการเปลี่ยนแปลงรหัสที่จำเป็นในการแก้ไขข้อผิดพลาด Bและทำการคอมไพล์กลับเข้าไปใน repo
  6. จากการรันบรรทัดคำสั่ง git stash pop
  7. ตอนนี้การเปลี่ยนแปลงที่ไม่ได้รับการยอมรับของคุณสำหรับฟีเจอร์ Aจะถูกปิดและสะสมไว้ในโค้ดความคืบหน้าของคุณพร้อมกับแก้ไข (มุ่งมั่นแล้ว) สำหรับBug B

คุณสามารถขยายเพิ่มเติมอีกเล็กน้อยเกี่ยวกับวิธีการทำงานของเวิร์กโฟลว์นี้ สถานะของพื้นที่เก็บข้อมูลในแต่ละจุดคืออะไร? คุณช่วยแนะนำใครบางคนให้ผ่านขั้นตอนการใช้ git stash ได้ไหม?

0

แยกสเตจ (และคอมมิต) การเปลี่ยนแปลงที่เกี่ยวข้องกับบั๊กแก้ไข ในส่วนขยาย Git นี่เป็นเรื่องง่ายอย่างยิ่ง จาก commandline git add -pผมคิดว่าคุณต้องทำ

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