การควบคุมเวอร์ชันเมื่อใดมีขนาดใหญ่เกินไป? [ปิด]


65

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

สำหรับฉันฉันมีปัญหาในการพยายามทำ "ความมุ่งมั่นเล็ก ๆ " เนื่องจากฉันลืมหรือสร้างสิ่งที่สร้างสิ่งอื่นที่สร้างอย่างอื่น จากนั้นคุณก็จบลงด้วยสิ่งต่างๆดังนี้:

ทำคิวขาออกที่กำหนดเอง

Bot
- เขตข้อมูลใหม่ msgQueue ซึ่งไม่มีอะไรมากไปกว่า SingleThreadExecutor
-sendMsg บล็อกจนกว่าข้อความจะถูกส่งและเพิ่มรอระหว่างเมื่อข้อความได้รับ
ส่ง
-adminExist ปรับปรุงสาย (ดูตัวควบคุม)
- ลบเรียกร้องให้ sendMessage

ตัวควบคุม
- เขตข้อมูลใหม่ msgWait หมายถึงเวลาในการรอระหว่างข้อความ
- เริ่มต้นปลั๊กอินบริการย้ายไปที่ reloadPlugins
-adminExists ย้ายจากเซิร์ฟเวอร์เนื่องจากผู้ดูแลระบบส่วนกลาง ตรวจสอบที่ช่อง
เซิร์ฟเวอร์และระดับโลก

ผู้ดูแลระบบ
- เมธอดใหม่ getServer และ getChannel ที่รับค่า Admin Object ที่เหมาะสม
เป็นของ

BotEvent
-toString () แสดงเป็นพิเศษและ extra1

ช่อง
- ช่องทางเปลี่ยนชื่อเป็นชื่อ
แก้ไขตัวพิมพ์ผิดในช่อง (int)

เซิร์ฟเวอร์
-Moved adminExists เพื่อควบคุม

PluginExecutor
- การทดสอบย่อยเพิ่มจะถูกลบในภายหลัง

JS ปลั๊กอิน
- ปรับปรุงเพื่อการเปลี่ยนแปลงกรอบ
แทนที่ InstanceTracker.getController () ด้วย Controller.instance
-VLC คุยตอนนี้ในไฟล์ของตัวเอง

อัพเดตและการเปลี่ยนแปลงของโครงการ NB ต่างๆ

---

ไฟล์ที่ได้รับผลกระทบ
แก้ไข /trunk/Quackbot-Core/dist/Quackbot-Core.jar
แก้ไข /trunk/Quackbot-Core/dist/README.TXT
แก้ไข /trunk/Quackbot-Core/nbproject/private/private.properties
แก้ไข /trunk/Quackbot-Core/nbproject/private/private.xml
แก้ไข /trunk/Quackbot-Core/src/Quackbot/Bot.java
แก้ไข /trunk/Quackbot-Core/src/Quackbot/Controller.java
แก้ไข /trunk/Quackbot-Core/src/Quackbot/PluginExecutor.java
แก้ไข /trunk/Quackbot-Core/src/Quackbot/info/Admin.java
แก้ไข /trunk/Quackbot-Core/src/Quackbot/info/BotEvent.java
แก้ไข /trunk/Quackbot-Core/src/Quackbot/info/Channel.java
แก้ไข /trunk/Quackbot-Core/src/Quackbot/info/Server.java
แก้ไข /trunk/Quackbot-GUI/dist/Quackbot-GUI.jar
แก้ไข /trunk/Quackbot-GUI/dist/README.TXT
แก้ไข /trunk/Quackbot-GUI/dist/lib/Quackbot-Core.jar
แก้ไข /trunk/Quackbot-GUI/nbproject/private/private.properties
แก้ไข /trunk/Quackbot-GUI/nbproject/private/private.xml
แก้ไข /trunk/Quackbot-GUI/src/Quackbot/GUI.java
แก้ไข /trunk/Quackbot-GUI/src/Quackbot/log/ControlAppender.java
ลบ /trunk/Quackbot-GUI/src/Quackbot/log/WriteOutput.java
แก้ไข /trunk/Quackbot-Impl/dist/Quackbot-Impl.jar
แก้ไข /trunk/Quackbot-Impl/dist/README.TXT
แก้ไข /trunk/Quackbot-Impl/dist/lib/Quackbot-Core.jar
แก้ไข /trunk/Quackbot-Impl/dist/lib/Quackbot-GUI.jar
แก้ไข /trunk/Quackbot-Impl/dist/lib/Quackbot-Plugins.jar
แก้ไข /trunk/Quackbot-Impl/lib/javarebel.stats
เพิ่ม /trunk/Quackbot-Impl/lib/jrebel.info
แก้ไข /trunk/Quackbot-Impl/nbproject/private/private.properties
แก้ไข /trunk/Quackbot-Impl/nbproject/private/private.xml
แก้ไข /trunk/Quackbot-Impl/nbproject/project.properties
แก้ไข /trunk/Quackbot-Impl/plugins/CMDs/Admin/reload.js
เพิ่ม / trunk / Quackbot-Impl / plugins / CMDs / Operator / hostBan
แก้ไข /trunk/Quackbot-Impl/plugins/CMDs/Operator/mute.js
แก้ไข /trunk/Quackbot-Impl/plugins/CMDs/lyokofreak/curPlaying.js
แก้ไข /trunk/Quackbot-Impl/plugins/CMDs/lyokofreak/lfautomode.js
แก้ไข /trunk/Quackbot-Impl/plugins/listeners/onJoin.js
แก้ไข /trunk/Quackbot-Impl/plugins/listeners/onQuit.js
แก้ไข /trunk/Quackbot-Impl/plugins/testCase.js
เพิ่ม /trunk/Quackbot-Impl/plugins/utils/whatsPlaying.js
แก้ไข /trunk/Quackbot-Impl/src/Quackbot/impl/SandBox.java
เพิ่ม / trunk / Quackbot-Impl / vlc_http
เพิ่ม /trunk/Quackbot-Impl/vlc_http/current.html
แก้ไข /trunk/Quackbot-Plugins/dist/Quackbot-Plugins.jar
แก้ไข /trunk/Quackbot-Plugins/dist/README.TXT
แก้ไข /trunk/Quackbot-Plugins/dist/lib/Quackbot-Core.jar
แก้ไข /trunk/Quackbot-Plugins/nbproject/private/private.properties
แก้ไข /trunk/Quackbot-Plugins/nbproject/private/private.xml
แก้ไข /trunk/Quackbot-Plugins/src/Quackbot/plugins/JSPlugin.java
เพิ่ม / trunk / Quackbot-Plugins / vlc_http
เพิ่ม /trunk/global-lib/jrebel.jar

ใช่....

ดังนั้นสำหรับคำถาม:

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

list.madduck.net/pipermail/vcs-home/2010-September/000276.htmlอธิบายกรณีที่ตัวไฟล์ข้อมูลมีขนาดใหญ่เกินไปที่จะเก็บไว้ในที่เก็บได้อย่างมีประสิทธิภาพ (แต่ฉันแน่ใจว่านั่นไม่ใช่สิ่งที่คุณกำลังพูดถึงที่นี่)
Ken Bloom

ไม่สร้างสรรค์ ????? ฉันเพิ่งเรียนรู้ตันที่นี่! Mods โปรดหยุดตอบคำถามมังกรของคุณ!
richard

สิ่งที่คุณไม่เคยเห็นเพียงไฟล์เดียวที่มีไฟล์นับร้อย ๆ ไฟล์ซึ่งการตัดส่วนใดของไฟล์จะไม่รวบรวม
Joshua

คำตอบ:


67

สำหรับฉันฉันมีปัญหาในการพยายามทำ "ความมุ่งมั่นเล็ก ๆ " เนื่องจากฉันลืมหรือสร้างสิ่งที่สร้างสิ่งอื่นที่สร้างอย่างอื่น

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

ปัญหาที่เกิดจากการกระทำที่ใหญ่คือ:

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

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

(อีกกรณีหนึ่งคือเมื่อคุณทำการอิมพอร์ตเริ่มต้น แต่นั่นไม่ใช่ปัญหาจากมุมมองของปัญหาที่กล่าวข้างต้น)


7
+1 เรียนรู้วิธีการแบ่งย่อยเป็นชิ้นเล็ก ๆ อย่างแน่นอน เมื่อมองหาบั๊กการคอมมิทที่น้อยลงจะง่ายต่อการจัดการ หลังจากไม่กี่ครั้งแรกของการจ้องมองที่ความมุ่งมั่นที่มีขนาดใหญ่คุณจะได้รับนิสัย: P
dr Hannibal Lecter

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

1
นอกจากนี้ commits ที่มีขนาดเล็ก = diffs ที่เล็กลงสำหรับผู้ที่รีวิว PRs กระทำโดยคอมมิชชัน
peter

40

หลักการความรับผิดชอบเดี่ยว

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

เป็นเรื่องปกติที่จะมีการเปลี่ยนแปลงที่ไม่เกี่ยวข้องหรือกึ่งที่เกี่ยวข้องในสำเนาการทำงานของคุณเป็นจำนวนมาก สิ่งนี้เรียกว่า "ปัญหาเกี่ยวกับสำเนาที่ทำงานยุ่งเหยิง" และจริงๆแล้วมันยากมากที่จะหลีกเลี่ยงแม้แต่กับนักพัฒนาที่มีระเบียบวินัย อย่างไรก็ตาม Git และ Mercurial ทั้งสองมีเครื่องมือในการแก้ไข - git add -pหรือchunk selection และ Mercurial Queues ใน TortoiseHgตามลำดับ


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

26

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

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


ยอมรับอย่างสมบูรณ์ด้วย "ไฟล์ 1 บรรทัด / 10" มีตัวแปรมากเกินไปที่จะตอบคำถามนี้ด้วยชุดของกฎหมายมาตรฐาน
Pulak Agrawal

7
สิ่งเดียวที่ฉันเพิ่มคือบางครั้งมันก็สมเหตุสมผลที่จะมีขนาดเล็กกว่า "คำขอเดียวหนึ่งชุดเปลี่ยนแปลง" คำขอที่มีขนาดใหญ่ขึ้นควรแบ่งออกเป็นชุดการเปลี่ยนแปลงที่มีขนาดเล็กและเพิ่มขึ้น (ดังที่ได้กล่าวไว้ในคำตอบอื่นการพัฒนาสาขาอาจช่วยสิ่งนี้) ในท้ายที่สุดฉันอาจปรับเปลี่ยนมนต์ดังกล่าว: "หนึ่งคำขอหนึ่งการเปลี่ยนแปลง (หรือมากกว่า!) หนึ่งชุด"
rinogo

10

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

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

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


7

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


7

ตัวอย่างนี้แสดงความมุ่งมั่นที่มีขนาดใหญ่เกินไป

ตามกฎง่ายๆอธิบายการเปลี่ยนแปลงในหนึ่งประโยคหรือหนึ่งบรรทัดของข้อความ (ตามกฎนี้การคอมมิชชันควรแบ่งออกเป็น 10-15 อันเล็ก) หากคุณไม่สามารถคอมเม้นท์การคอมมิทในบรรทัดเดียวได้แสดงว่ามันมีขนาดใหญ่เกินไป

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


ที่เก็บเคอร์เนล Linux มีตัวอย่างที่ดีมากมายเกี่ยวกับการละเมิดกฎนี้ - พวกเขามักจะมีคำอธิบายมากมายเกี่ยวกับสาเหตุของข้อผิดพลาดหรือเหตุผลสำหรับการแก้ไขในเนื้อความของข้อความคอมมิท กฎที่เหมาะสมของรุ่นจะเป็น "คุณควรจะสามารถอธิบายประเด็นหลักของการกระทำใน 1 ประโยคได้เสมอ"
Ken Bloom

@Ken: เป้าหมายของฉันที่นี่คือการช่วยให้บุคคลที่ถามคำถามไม่ได้มากับกฎที่ครอบคลุมทุกแหล่งเก็บรหัสต้นฉบับที่มีอยู่ในโลก
azheglov

6

ในสาขาของฉัน (การสร้างแบบจำลองทางฟิสิกส์) ฉันค้นพบข้อบกพร่องในผลลัพธ์วันนี้ซึ่งไม่ได้อยู่ในที่เก็บเมื่อ 6 เดือนที่แล้ว เมื่อสิ่งนี้เกิดขึ้นฉันจะทำการค้นหาแบบไบนารีในการแก้ไข:

  1. เรียกใช้แบบจำลองจาก 3 เดือนที่ผ่านมา
  2. หากบั๊กยังคงอยู่ในเอาต์พุตให้รันโมเดลจาก 4.5 เดือนที่ผ่านมา
  3. ... ทำซ้ำจนกว่าฉันจะพบการกระทำที่ให้ผลในการส่งออกที่ไม่ดี

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

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


เดือนระหว่างการกระทำเสียงเหมือนกระทำมากในวิธีการที่ทันสมัยที่สุด ...
Rig

5

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

คุณอาจเปลี่ยนเช่นตัวอย่างของทุก__macro1การ__macro2ในฐานรหัสขนาดใหญ่ซึ่งการเปลี่ยนแปลง 200 ไฟล์ ในกรณีนั้นจะมีข้อผูกมัด 200 ข้อ

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

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

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

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


4

สิ่งที่ต้องเข้าใจที่นี่คือ "ใหญ่" ในบริบทนี้เกี่ยวกับการเปลี่ยนแปลงที่ชัดเจนจำนวนไม่ใช่ขนาดทางกายภาพของการกระทำ (แม้ว่าโดยทั่วไปแล้วทั้งสองจะจับมือกัน)

มันไม่ใช่คำถามที่ว่า "อย่าทำสิ่งที่ต้องทำมากมาย" เช่นเดียวกับการทำสิ่งเล็ก ๆ - สิ่งที่ดีที่สุดที่จะยอมรับการเปลี่ยนแปลงเล็ก ๆ ที่มีอยู่ในตัวเอง

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

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

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

อีกอย่างหนึ่ง - หากมีสิ่งใดมาพร้อมกับงานของคุณที่ต้องการความสนใจอย่างเร่งด่วนคุณต้องเปลี่ยนมันแยกต่างหาก (โดยเฉพาะอย่างยิ่งในชุดโฟลเดอร์ที่แตกต่างกันโดยสิ้นเชิง) แล้วส่งแยกต่างหาก

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


4

อย่างน้อยที่สุดฝึกฝนตัวเองให้ทำเมื่อใดก็ตามที่คุณคิดกับตัวเองว่า "ฉันชอบความก้าวหน้าของฉันและฉันไม่ต้องการที่จะสูญเสียมันหากการเปลี่ยนแปลงที่ฉันกำลังจะทำนั้นเป็นหายนะ" จากนั้นคุณมีตัวเลือกในการใช้ประโยชน์จาก VCS เพื่อกำจัดจุดจบที่คุณพยายามหรือรหัสการดีบักแบบพิเศษที่คุณเพิ่มเพื่อติดตามปัญหา (เช่นมีgit reset --hardหรือrm -rf *; svn update)


2

ไม่มีกฎที่ยากและรวดเร็วไม่มีเส้นแบ่งผ่านซึ่งความมุ่งมั่นของคุณใหญ่เกินไป

มีเป็นแต่เป็นแนวทางที่กระทำที่มีขนาดเล็กที่ดีขึ้นภายในเหตุผล (เช่นการกระทำทุกบรรทัดมากเกินไป probaby)

ฉันจำแนวทางเหล่านี้ไว้ในใจ:

  • คอมมิทเดียวควรรวมการเปลี่ยนแปลงสำหรับการแก้ไขข้อบกพร่องเพียงหนึ่ง
  • ความมุ่งมั่นเดียวไม่ควรรวมงานมากกว่าครึ่งวัน
  • ความมุ่งมั่นเดียวไม่ควรทำลายการสร้าง

แน่นอน - นี่คือสิ่งที่ฉันจำไว้ - YMMV นักพัฒนาที่แตกต่างกันชอบระดับที่แตกต่างกันของเมล็ด


1

ยิ่งความมุ่งมั่นน้อยลงเท่าไหร่ก็จะยิ่งง่ายขึ้นในการค้นหาว่าการถดถอยนั้นมาจากไหน

เป็นการกระทำที่ควรจะเป็นปรมาณูในแง่ของการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ที่สอดคล้องกันกับฐานรหัส (เกี่ยวข้องกับบั๊กคุณลักษณะ ฯลฯ )

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

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

เวิร์กโฟลว์ของคุณอาจมีลักษณะดังนี้:

code code code
git commit       // create commit locally with meaningful message
code code code
git commit       // create commit locally with meaningful message
code code code
git commit       // create commit locally with meaningful message
...
git push         // push your previous commits to the team server

ใช้ vcs ส่วนกลาง:

svn copy trunk my_feature_branch  // create your private branch
svn co my_private_branch          //
code code code
svn commit                        // commit on your private branch with meaningful comment
code code code
svn commit                        // commit on your private branch with meaningful comment
code code code
svn commit                        // commit on your private branch with meaningful comment
...
svn merge my_feature_branch trunk  // all your previous commit are merged to main/master branch

0

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

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

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


0

ข้อความคอมมิทควรเป็นหนึ่งบรรทัดเท่านั้น (และสำหรับ git สูงสุด 60 ตัวอักษร) จำนวนของรหัสที่ถูกยืนยันจะต้องมีขนาดเล็กพอที่จะทำให้ข้อความอธิบายภายในขีด จำกัด นั้น

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


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

@TheLQ: อีกครั้งฉันนำมาเป็นตัวอย่างจำนวนมากของความมุ่งมั่นในเคอร์เนลลินุกซ์ที่ข้อความกระทำยาวทำหน้าที่ในการสื่อสารเหตุผลสำหรับการเปลี่ยนแปลงเฉพาะกับนักพัฒนาอื่น ๆ
Ken Bloom

@TheLQ นั่นเป็นสิ่งที่ทำงานได้ดีสำหรับเรา จำไว้ว่าคุณต้องมี "ทำไม" อยู่ที่ไหน

0

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

git citool สามารถให้คุณเลือก hunks ที่เฉพาะเจาะจงของไฟล์ (หรือบรรทัดที่เฉพาะเจาะจง) ที่จะกระทำในการกระทำที่เฉพาะเจาะจงเพื่อให้คุณสามารถแยกการเปลี่ยนแปลง (ไม่ทับซ้อนกัน) ที่ทำกับไฟล์เดียวกันเป็นหลายคอมมิชชัน

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


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

@TheLQ: นั่นคือสิ่งที่คุณต้องทำถ้าคุณต้องการจัดระเบียบของคุณให้เป็นลอจิคัลเชิงตรรกะ: มีระเบียบวินัยมากเกี่ยวกับการลงมือทำ แต่เนิ่นๆและทำบ่อย ๆ (และอย่ากลัวที่git rebaseจะเข้าร่วมคอมมิชชันที่เป็นส่วนเดียวกัน การแก้ไข) หรือเรียนรู้git citoolวิธีการใช้หวีซี่ละเอียดเพื่อแบ่งสิ่งต่าง ๆ ออกเป็นส่วนที่เป็นตรรกะเมื่อคุณพร้อมที่จะส่งมอบในตอนท้ายของวัน
Ken Bloom

0

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


0

ในการตอบคำถามของคุณ:

1) สำหรับฉันความมุ่งมั่นมาตรฐานถือว่าใหญ่ถ้ามันทำมากกว่าหนึ่งอย่าง โดยสิ่งที่ฉันหมายถึงการแก้ไขข้อผิดพลาดหรือเพิ่มคุณสมบัติ

2) ป้องกันการกระทำดังกล่าวโดยทำให้เป็นนิสัยและกฎที่จะกระทำเมื่อใดก็ตามที่คุณทำอะไรบางอย่างเสร็จ

3) ในช่วงครึ่งแรกของการพัฒนาฉันอนุญาตให้คอมมิตรวมการสร้างไฟล์ครั้งแรกซึ่งจะใช้ในภายหลัง

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

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

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


0

ในกรณีของฉันฉันกำลังพยายามส่งไฟล์ของเซิร์ฟเวอร์ไปยังระบบที่เก็บ (SVN) นี่เป็นการกระทำครั้งแรกและไม่ต้องการดาวน์โหลดเนื่องจากเป็นโครงการที่มีขนาดใหญ่มาก (ไม่กี่ GB) และฉันต้องการเริ่มต้นส่งมอบเซิร์ฟเวอร์ไคลเอนต์

ปัญหาคือว่าไคลเอนต์อยู่บนเซิร์ฟเวอร์ที่ใช้ร่วมกันไคลเอนต์ svn ถูกฆ่า (หรือซอฟต์แวร์อื่น ๆ ) ถ้ามันทำงานมากกว่าหนึ่งนาที

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

นักพัฒนาก่อนหน้าฉันไม่เคยใช้ระบบควบคุมเวอร์ชัน


-1

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

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