ฉันควรทำอย่างไรเมื่อฉันรอนานเกินไประหว่างการคอมมิท?


100

ฉันเป็นคนซน ... "รหัสโคบาล" มากเกินไปยังไม่พอ ตอนนี้ที่นี่ฉันมีความมุ่งมั่นอย่างมาก ใช่ฉันน่าจะทำมาตลอด แต่มันก็สายเกินไปแล้ว

อะไรดีกว่า?

  1. ทำสิ่งหนึ่งที่มีขนาดใหญ่มากในรายการสิ่งที่ฉันเปลี่ยน
  2. พยายามแบ่งมันออกเป็นข้อผูกพันเล็ก ๆ ที่อาจไม่ได้รวบรวมเนื่องจากไฟล์มีการแก้ไขหลายอย่างเปลี่ยนแปลงชื่อเมธอดเพิ่มเติม ฯลฯ
  3. พยายามทำการย้อนกลับบางส่วนของไฟล์เพื่อความมุ่งมั่นที่เหมาะสมจากนั้นนำการเปลี่ยนแปลงใหม่กลับมา

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

โดยวิธีการ:ฉันใช้ SVN และ Subclipse ฉันสร้างสาขาใหม่ก่อนทำการเปลี่ยนแปลงใด ๆ เหล่านี้

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


2
คุณใช้โปรแกรมควบคุมเวอร์ชันใดอยู่ มีโมดูลที่อนุญาตให้คุณแบ่งการแก้ไขใน "hunks" เช่นกลุ่มของบรรทัดที่แก้ไขซึ่งจะช่วยให้คุณจัดกลุ่มการแก้ไขของคุณในแบบที่คุณชอบและแจกจ่าย mods ของไฟล์เดียวไปยังชุดการเปลี่ยนแปลงหลายชุด เช่น Mercurial มีการขยาย "ชั้นวาง" แน่นอนคุณควรตรวจสอบว่าการเปลี่ยนแปลงแต่ละชุดรวบรวมหรือไม่หากเกี่ยวข้องกับกระบวนการของคุณ ไม่ว่าจะเป็นปัญหาที่คุ้มค่านั้นขึ้นอยู่กับคุณและร้านค้าของคุณ
alexis

6
อย่างน้อยก็เช็คอินที่สาขาดังนั้นคุณจะไม่สูญเสียการเปลี่ยนแปลง
Rory Hunter

2
คุณสามารถถามคำถามกับตัวเองและรออีกต่อไปหรือจะกระทำและจัดการกับความยุ่งเหยิงที่เกิดขึ้น ... จากนั้น ... อย่าทำอีกครั้ง!
haylem

40
# 1 อธิษฐานขอการให้อภัยและจากนั้นออกไปและบาปไม่มาก :)
Peteris

5
คำถามที่สำคัญยิ่งกว่าที่คุณควรถามตัวเองคือ: "ฉันจะเปลี่ยนนิสัยที่ไม่ดีของฉันอย่างไรเพื่อป้องกันไม่ให้เกิดเหตุการณ์เช่นนี้อีก" ควรจะมีไม่มีเหตุผลที่จะกระทำไม่ได้อย่างน้อยวันละครั้งเดียวดีกว่าบ่อยขึ้น
Doc Brown

คำตอบ:


52

ในการตอบคุณต้องถามตัวเองว่าคุณคาดหวังที่จะใช้ผลลัพธ์เหล่านี้ในอนาคตอย่างไร สาเหตุที่พบบ่อยที่สุดคือ:

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

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

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

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


คำตอบที่ยอดเยี่ยม! ในขณะที่ฉันไม่รู้สึกเสียใจน้อยลงเกี่ยวกับการไม่ทำสิ่งเล็ก ๆ แต่ฉันก็รู้สึกดีขึ้นมากเกี่ยวกับสิ่งที่ฉันควรทำเพื่อให้ได้พฤติกรรมที่ดีกลับคืนมา
durron597

1
อีกสิ่งหนึ่งที่เกี่ยวกับ 3 และ 5 คืองานใด ๆ ที่คุณทำในขณะนี้เพื่อให้พวกเขาเกิดขึ้นคุณสามารถรอจนกว่าคุณจะต้องการมันแล้วทำงานแบบเดียวกัน มันอาจจะค่อนข้างยากในอนาคตเพราะความทรงจำของคุณในสิ่งที่คุณทำหายไป แต่อีกครั้งคุณอาจไม่ต้องการมัน
Steve Jessop

จากประสบการณ์ของฉันมันเป็นเรื่องลำบากและเปราะบางที่ต้องพึ่งพาความคิดเห็นการควบคุมเวอร์ชันเพื่อบอกเล่าเรื่องราวว่าทำไมโค้ดถึงมี (เช่นเหตุผล 1 และ 2) หากคุณกำลังใช้ SVN กับสาขาประวัติความเป็นมาจะหายไปจากการรวมกันแล้ว (คุณจะดีขึ้นด้วยสิ่งที่ทันสมัยกว่าเช่นคอมไพล์) ดังนั้น IMHO จึงได้รับความคิดเห็นที่ดีที่สุด
Hans-Peter Störr

1
@hstoerr - หากคุณอยู่ใน Subversion 1.5 หรือใหม่กว่าคุณสามารถเก็บประวัติด้วยตัวเลือก --reintegrate เมื่อทำการผสาน
ดัสตินเคนดัลล์

1
git add -p เป็นเพื่อนที่ดีที่สุดของคุณที่นี่ ฉันตกหลุมรักกับคุณสมบัตินั้น วิธีนี้ฉันสามารถคอมมิทการแก้ไขมาตรฐานในการคอมมิชชันแยกต่างหากและเก็บการเปลี่ยนแปลงโค้ดที่เกี่ยวข้อง
Spidey

39

ฉันคิดว่าสิ่งที่คุณทำพยายามหลีกเลี่ยงการตรวจสอบในรหัสที่คุณรู้ว่าจะไม่รวบรวม

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


ตัวเลือกที่สามเป็นไปได้ แต่มันจะมากใช้เวลานาน ฉันคิดว่าฉันกำลังจะทำทางเลือก 1
durron597

3
อะไรคือข้อเสียของการยอมรับรหัสที่จะไม่รวบรวมหรือสร้างในสาขาฟีเจอร์ (หรือคล้ายกัน) ที่แย่มาก ๆ ที่จะบังคับคนให้หลีกเลี่ยงการทำเช่นนั้น "สิ่งที่พวกเขาทำ"? ฉันคิดว่าการกระทำที่น่ากลัวอย่างแท้จริงอาจจะหลีกเลี่ยงโดยคนอื่น ๆ ซึ่งเป็นเหตุผลที่แท้จริงว่าทำไมฉันเพียงต้องการหลีกเลี่ยงพวกเขาในสถานที่แรก (สมมติว่าของหลักสูตรที่กระทำจะไม่ถูกปล่อยออกมา )
Kenny Evitt

3
"หลีกเลี่ยงการตรวจสอบในรหัสที่จะไม่รวบรวม"ใช้เฉพาะกับที่ใช้ร่วมกันรหัสฐาน / สาขา ในโครงการแบบคนเดียวหรือสาขาการพัฒนาแบบคนเดียวฉันอ้างว่ามันสำคัญกว่าที่จะรับการเปลี่ยนแปลงใน VC เพื่อให้คุณไม่สูญเสียสิ่งต่าง ๆ
สตีเฟ่นซี

3
เช่น @StephenC เพราะมันแบ่งเครื่องมือเช่น git-bisect หากโค้ดคอมไพล์ / รันตลอดเวลาและคุณต้องการค้นหาการถดถอยถ้ามันรวบรวมตลอดเวลาคุณสามารถค้นหาแบบไบนารี่ได้ (ไม่พูดถึงว่าหากมีการถดถอยในกลุ่มของโค้ดคุณจะเหลือการเปลี่ยนแปลงขนาดใหญ่เพื่ออ่านแทนการ จำกัด มันลง)
Maciej Piechotka

@MaciejPiechotka - แน่นอนถ้าคุณต้องการใช้เครื่องมือเฉพาะในสาขาส่วนตัวของคุณและพวกเขาต้องการรหัสที่สามารถคอมไพล์ได้ให้ทำเช่นนั้น แต่นั่นไม่ใช่เรื่องปกติสำหรับโครงการ / สาขาเดียว
Stephen C

19

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

ตัวเลือกที่ 1ทำให้งงงวยประวัติการเปลี่ยนแปลงที่คุณทำ แต่ไม่เช่นนั้นจะไม่ทำให้เกิดปัญหาใด ๆ

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

ตัวเลือกที่ 3ดีที่สุดทุกอย่างเท่าเทียมกัน แต่ถ้าคุณอธิบายไว้ที่อื่นการทำเช่นนั้นจะต้องใช้เวลา "มาก" หรือต้องเสียค่าใช้จ่ายที่สำคัญอื่น ๆ คุณจะต้องชั่งน้ำหนักต้นทุนเหล่านั้นเทียบกับผลประโยชน์ที่คาดหวังของ สร้างทำความสะอาดมุ่งมั่น

จากข้อมูลที่คุณให้ฉันเลือกตัวเลือกที่ 1 บางทีคุณควรตั้งค่าการแจ้งเตือนเพื่อให้คุณยืนยันการเปลี่ยนแปลง

การสร้างต้นแบบและการเขียนใหม่

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

เมื่อคุณสร้างรหัสใหม่ให้ทำการคอมมิทเมื่อใดก็ตามที่คุณต้องการบันทึกการเปลี่ยนแปลงเกือบจะแน่นอนในสาขา แต่บางทีในโครงการแยกต่างหาก หรือแม้กระทั่งทำงานนอกการควบคุมเวอร์ชันโดยสิ้นเชิง คุณสามารถมุ่งเน้นไปที่การรวบรวมหลักฐานเกี่ยวกับความเป็นไปได้ของสมมติฐานหรือการออกแบบที่คุณกำลังพิจารณาอยู่ ฉันมักจะเขียนต้นแบบเล็ก ๆ โดยใช้เครื่องมือต่าง ๆ เช่น LINQPad แทน Visual Studio สำหรับรหัส C #

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


1
คำตอบที่ดี; Kenny คุณมีบทความที่ดีหรือฐานความรู้อื่น ๆ เพื่อเชื่อมโยงกับรายละเอียดเฉพาะเพิ่มเติมเกี่ยวกับการสร้างต้นแบบหรือไม่ การสร้างต้นแบบรุ่นของฉันคือ "ร่างในสมุดบันทึกหรือบนกระดานไวท์บอร์ด"
durron597

@ durron597 ฉันไม่สามารถนึกถึงลิงก์ใด ๆ (แม้แต่มองหา) จากส่วนหัวของฉัน ฉันได้เล่นกับภาษาการเขียนโปรแกรมแปล (และรวบรวมแบบไดนามิก) พอที่ฉันไม่ได้คิดว่าความคิดของ 'ต้นแบบ' อาจเป็นนวนิยาย! และฉันได้เขียนโปรแกรม C, C ++ และ Java จำนวนมาก (อีกครั้งและอีกครั้ง) ที่ฉันไม่คิดว่ามันอาจจะแปลกเกินไปหรืออย่างน้อยก็แปลกใหม่สำหรับบางคน
Kenny Evitt

12

แม้ว่าคำตอบที่สมเหตุสมผลเพียงอย่างเดียวคือไม่ทำให้ลำต้นแตกแต่บางครั้งก็เป็นไปไม่ได้ ตัวอย่างเช่น svn สามารถหยุดการกระทำได้หากคุณกระทำมากเกินไป (อาจจะเป็นตัวเลือกหรือคุณลักษณะที่ฉันไม่แน่ใจ) ในกรณีพิเศษเช่นเช็คอินเป็นชิ้น ๆ เนื่องจากคุณเป็นโปรแกรมเมอร์คนเดียวมันจะไม่รบกวนใคร

ดังนั้นฉันจะไปหาตัวเลือก 1 หากไม่สามารถทำได้ตัวเลือกที่ 2

ตัวเลือก 3 ต้องใช้ความพยายามมากและไม่คุ้มค่า


1
หรือแท็กเวอร์ชันที่ไม่ได้รวบรวมเป็น "DOESN'T COMPILE"
ratchet freak

2
@ ratchetfreak: ฉันเดาว่า "แท็ก" ใน SVN จะไม่ช่วยอะไรมากนักเนื่องจากแท็กไม่ทำงานเป็น "ความคิดเห็น" บนลำต้น
Doc Brown

@DocBrown ฉันหมายถึงการเพิ่มลงในข้อความคอมมิชชัน
ratchet freak

5
@ ratchetfreak ฉันจะทำมันเป็น "ส่วนที่ X / N: การตรวจสอบใน ABC - DOESNT คอมไพล์"
BЈовић

ตัวเลือก 3 ไม่ต้องใช้ความพยายามมาก คำตอบอื่นอธิบายถึงวิธีการที่จะทำมันได้อย่างรวดเร็วและง่ายดายโดยใช้และgit add --patch git stashสถานการณ์ดูเหมือนยากเนื่องจากเครื่องมือและแหล่งความรู้ที่ล้าสมัย
Ron MacNeil

7

พยายามแบ่งมันออกเป็นข้อผูกพันเล็ก ๆ ที่อาจไม่ได้รวบรวมเนื่องจากไฟล์มีการแก้ไขหลายอย่างเปลี่ยนแปลงชื่อเมธอดเพิ่มเติม ฯลฯ

เมื่อฉันพบตัวเองในสถานการณ์ที่คล้ายคลึงกันฉันใช้เทคนิคต่อไปนี้:

  1. เพิ่มเฉพาะรหัสที่เกี่ยวข้องกับคุณสมบัติเฉพาะ: git add --patch
  2. ซ่อนการเปลี่ยนแปลงอื่น ๆ ทั้งหมด: git stash save --keep-index
  3. เรียกใช้การทดสอบ / ลองรวบรวม
  4. กระทำการเปลี่ยนแปลงหากทุกอย่างโอเคถ้าไม่ไป 1

ฉันไม่คุ้นเคยกับ SVN ดังนั้นฉันไม่รู้ว่าสิ่งนี้จะใช้กับสถานการณ์ของคุณได้หรือไม่ แต่พื้นฐานควรจะเหมือนกัน - แยกส่วนเล็ก ๆ ของรหัสและทดสอบเป็นรายบุคคล


ฉันชอบสิ่งนี้ แต่น่าเสียดายที่หนึ่งในหลาย ๆ สิ่งในรายการสิ่งที่ต้องทำของฉัน (มีจำนวนมากเมื่อคุณเป็นคนที่แต่งตัวประหลาดเทคโนโลยีเพียงคนเดียวใน บริษัท ) คือการเปลี่ยนจาก SVN เป็น Git และฉันยังไม่ได้ไปเลย .
durron597

1
เนื่องจากฉันยังไม่พอที่จะใช้--patchฉันจึงใช้เลิกทำในบานหน้าต่างเครื่องมือแก้ไขต่าง ๆ เพื่อไปยังสถานะการทำงานก่อนหน้านี้และยอมรับ จากนั้นฉันทำซ้ำสำหรับการส่งครั้งต่อไป เนื่องจากสิ่งล่อใจที่จะทำให้รหัสเพิ่มเติมเล็กน้อยเมื่ออยู่ในสถานะ Undone ฉันจะทำการสำรองข้อมูลเสมอก่อนที่ฉันจะเริ่มกระบวนการนี้!
joeytwiddle

ด้วยคอมไพล์คุณสามารถเพิ่มแบบโต้ตอบ (เพิ่ม -i) ก่อนที่จะกระทำและสาขาหลังจากนั้นเพื่อตรวจสอบความมุ่งมั่นของคุณอย่างอิสระ
riezebosch

3

ตัวเลือกที่ 4: สำรองสถานะปัจจุบันของ repo ของคุณในสถานที่ชั่วคราวเปลี่ยน repo ของคุณกลับสู่สถานะเดิมทำรายการการเปลี่ยนแปลงทั้งหมดที่คุณทำ (คุณยังสามารถดูการสำรองข้อมูลชั่วคราว) จากนั้นปรับใช้ใหม่ด้วยตนเอง (และรวบรวม และทดสอบ!) พวกมันแยกจากกัน

สิ่งนี้ควรจะง่ายกว่านี้เพราะคุณได้เขียนรหัสไปแล้วมันเป็นเพียงการหาส่วนที่จะคัดลอกและวางจากการสำรองข้อมูลชั่วคราวของคุณ

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


นี่เป็นเพียงวิธีการทำทางเลือก # 3 อาจเป็นวิธีที่ดีที่สุดจริง แต่ก็ยังค่อนข้างเสียเวลา
durron597

มี 149 บรรทัดของการเพิ่ม / ลบ / ส่งข้อความเมื่อฉันได้กระทำหนึ่งที่มีขนาดใหญ่ อย่างน้อยก็ครึ่งวันในการทำเช่นนี้
durron597

@ durron597 ฉันไม่เห็นด้วยฉันคิดว่านี่แตกต่างจาก # 3 เกี่ยวกับ 149 บรรทัดคุณให้ความสำคัญกับประวัติการส่งมอบเท่าไหร่ มันคุ้มค่าที่จะใช้จ่ายครึ่งวันหรือไม่? อย่างไรก็ตามมันไม่เหมือนกับวิธีอื่น ๆ ที่ไม่จำเป็นต้องค้นหาว่าควรใช้บรรทัดใดในการยืนยันดังนั้นคุณจะต้องผ่าน 149 บรรทัดด้วยวิธีใดวิธีหนึ่ง ความแตกต่างในเวลาจะมีขนาดเล็ก
Superbest

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

คุณไม่จำเป็นต้องสำรองของคุณrepo ทั้งหมด คุณสามารถทำให้ "สำรอง" git reset HEAD~กระทำแล้วม้วนกลับหัวด้วย ความมุ่งมั่นของคุณจะยังคงอยู่git reflogหากคุณตัดสินใจว่าต้องการในภายหลัง คุณสามารถแยกสาขา (และเปลี่ยนกลับเป็นสาขาที่ใช้งานได้) ก่อนทำการรีเซ็ตเพื่อให้ "backup" ของคุณส่งชื่อ ลบสาขาในภายหลังหากคุณไม่ต้องการ แก้ไข: ขออภัยไม่ได้ตระหนักถึง OP อยู่ใน svn!
joeytwiddle

3

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

คุณมีแนวโน้มที่จะย้อนกลับ "ส่วน" ของสิ่งที่คุณทำ? ถ้าไม่เช่นนั้นให้ดำเนินการกับตัวเลือก 1 อย่างแน่นอน

มีเหตุผลสองสามข้อในการตรวจสอบรหัสในระบบควบคุมเวอร์ชัน และทั้งหมดของพวกเขาเมื่อคุณเป็นนักพัฒนาเพียงคนเดียวหมุนรอบความปลอดภัย - นั่นคือถ้าคุณพลาดเครื่องจักรจะตายหรืออะไรก็ตามคุณสามารถกลับไปที่จุดตรวจสุดท้ายได้เสมอ

โปรแกรมเมอร์ที่เข้ามาในโครงการในภายหลังไม่น่าจะต้องการย้อนกลับไปเป็นเวอร์ชันที่ไม่ได้รวบรวม ดังนั้น IMHO ตัวเลือกที่ 2 คือความบ้า

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

ในการวนซ้ำ: โดยการตรวจสอบรหัสของคุณคุณจะครอบคลุม / บันทึกก้นของคุณในกรณีที่เครื่องของคุณล้มเหลว ทุกอย่างในทีมคนเดียวคือการแต่งกายด้วยหน้าต่าง


1
การย้อนกลับไม่ใช่เหตุผลเดียวที่ใช้คอมมิชชันขนาดเล็ก มันไม่ได้เป็นเหตุผลที่ดีโดยเฉพาะอย่างยิ่ง เหตุผลหลักคือเพื่อให้สามารถดูเวลาและสาเหตุที่มีการเปลี่ยนแปลงและเพื่ออำนวยความสะดวกในการแก้ไขปัญหาเมื่อคุณประสบกับปัญหาที่ไม่ทราบที่มา โปรแกรมเมอร์อีกคนที่เข้ามาในโครงการในภายหลังอย่างน้อยก็เกือบจะพบบรรทัดของโค้ดที่ทำให้เขาไป "WTF" และกลับไปดูการกระทำที่เขียนหรือแก้ไขครั้งแรก หากการกระทำนั้นเป็นยักษ์ใหญ่ที่กระทำการเปลี่ยนแปลง 500 สิ่งเป็นไปไม่ได้ที่จะได้รับข้อมูลที่เป็นประโยชน์ใด ๆ จากประวัติศาสตร์
Aaronaught

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

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

1
@Aaraught ฉันจะเพิ่มว่าตัวเอง 3 เดือนต่อมาสามารถเป็น 'โปรแกรมเมอร์อื่น'
Maciej Piechotka

1
ฉันต้องไม่เห็นด้วยกับการแตกแขนงเป็นกลยุทธ์ที่ใช้การได้สำหรับการเปลี่ยนแปลงสถาปัตยกรรมหรือการเปลี่ยนแปลง "ทำลาย" อื่น ๆ นั่นนำไปสู่ฝันร้ายของการรวมความขัดแย้งและข้อผิดพลาดหลังการรวม ในระยะยาวมันไกลแสนเจ็บปวดน้อยกว่าที่จะหาวิธีที่จะทำลายการเปลี่ยนแปลงครั้งใหญ่ไปสู่การเปลี่ยนแปลงเล็ก ๆ ที่เข้ากันได้แบบย้อนหลังหรือในกรณีที่เลวร้ายที่สุดให้ใช้สิ่งที่ฟาวเลอร์ฮัมเบิลและคนอื่น ๆ เรียกว่าสาขา โดย Abstraction (ซึ่งจริง ๆ แล้วไม่ใช่สาขาเลย) กลยุทธ์ทั้งสองนี้แสดงถึงความมุ่งมั่นที่มีขนาดเล็กและมุ่งเน้น
Aaronaught

2

กฎของฉันคือ: ไม่มีการเช็คอินโดยไม่มีการตรวจสอบรหัสที่ร้ายแรง หากฉันเป็นของตัวเองฉันจะต้องตรวจสอบรหัสด้วยตัวเอง แต่จะต้องได้รับการตรวจสอบ ดูเหมือนว่าคุณจะมีการเปลี่ยนแปลงรหัสจำนวนหนึ่งซึ่งคนอื่นไม่สามารถตรวจทานได้ดังนั้นคุณจึงไม่สามารถตรวจสอบได้ด้วยตัวเอง (การตรวจสอบรหัสของคุณเองนั้นยากและต้องมีระเบียบวินัยมากขึ้นเนื่องจากคุณตั้งสมมติฐานผิดว่ารหัสของคุณถูกต้องโดยอัตโนมัติ )

กฎที่ไม่สามารถแตกหักได้ของทุกคนคือ: อย่าตรวจสอบโค้ดที่ไม่ได้สร้างและหลีกเลี่ยงการตรวจสอบโค้ดที่ไม่ทำงาน

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

นอกจากนี้ยังเป็นวิธีที่ดีในการฝึกฝนนิสัยการเขียนโปรแกรมที่ดี


นี่เป็นเหตุผลเดียวกับคำตอบตาม Git ข้างต้น ( git add --patchและgit stash) และเป็นตัวอย่างที่ดีของสถานการณ์ที่ DVCS สมัยใหม่สามารถจัดการได้ง่าย แต่ระบบเก่าไม่สามารถทำได้
Ron MacNeil

1

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

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


1
สิ่งนี้ดูเหมือนจะไม่เพิ่มสิ่งใดที่สำคัญกว่าสิ่งที่โพสต์แล้วในคำตอบก่อนหน้า 12 คำตอบ
gnat

-1

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

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

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

หลังจากนั้นคุณจะเห็นว่าการเปลี่ยนแปลงครั้งต่อไปไม่ได้นำคุณ "ยาวเกินไป" (ความหมาย)


2
เขาไม่ได้บอกว่าเขารักษารหัสไว้ไม่ได้เป็นเวลานาน รหัสใน repo นั้นไม่มีการแก้ไขเป็นเวลานาน - เก่า แต่ยังคงคอมไพล์ได้ รหัสในสำเนาการทำงานของเขาได้รับการปรับปรุงบ่อยครั้ง แต่ไม่ได้กระทำ ไม่มีสิ่งใดในคำถามที่ชี้ให้เห็นว่ารหัสของเขาอาจต้องมีการเปลี่ยนโครงสร้าง - "การเข้ารหัสคาวบอย" ที่นี่หมายถึงเวิร์กโฟลว์ SCM ของเขาไม่ใช่คุณภาพรหัสที่แท้จริง
Idan Arye

@IdanArye จากคำถามเดิม...Try to break it into smaller commits that likely won't compile...หากมีบางสิ่งที่ขัดขวางไม่ให้คุณยอมรับรหัสของคุณมากกว่าการร้องเพลงที่ดีรหัสนั้นยากที่จะจัดการ "กระทำ" เป็นเพียงหนึ่งในวิธีการสานต่องานของคุณ เราสามารถคิดถึงกรณีที่รุนแรงกว่านี้ - "ถ้ามีบางอย่างขัดขวางไม่ให้ฉันบันทึกไฟล์ต้นฉบับ" แล้วมันจะเป็นอะไร? ฉันคิดว่ามันกลัวการเปลี่ยนแปลงของคุณเอง ทำไมถึงเป็นเช่นนั้น? ... ฉันเดาว่าคุณจะได้รับคะแนน
AlexT

2
สำหรับฉันดูเหมือนว่าสิ่งที่ขัดขวางไม่ให้เขาทำคือความเกียจคร้าน
Idan Arye

@IdanArye คุณถูกต้องในทุกจำนวน นั่นบวกกับการทำ TDD ไม่เพียงพอซึ่งเป็นปัญหาแยกต่างหาก
durron597

@AlexT พิจารณาสถานการณ์ที่คุณแก้ไขข้อบกพร่องสองข้อและหนึ่งในนั้นต้องใช้วิธีการที่พัฒนาขึ้นใหม่ หากคุณทำอย่างถูกต้องคุณจะต้องแก้ไขข้อบกพร่องหนึ่งข้อจากนั้นแก้ไขข้อผิดพลาดอื่น ๆ หากคุณไม่ใช่จากนั้นเมื่อคุณส่งมอบคุณต้องรวมการเปลี่ยนแปลงทั้งสองอย่างในคอมมิทเดียวกันหรือคอมมิชชันบั๊กแรกด้วยการเปลี่ยนแปลงสำหรับอันที่สองยกเว้นเวอร์ชั่นที่คอมมิทไม่มีการเรียกเมธอดใหม่ ไม่ได้รวบรวม
durron597
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.