จุดประสงค์ของพื้นที่จัดเตรียมคือการมีพื้นที่ยืดหยุ่นสำหรับการส่งมอบของคุณ ฉันคิดว่าสิ่งนี้จะชัดเจนขึ้นถ้าคุณเปรียบเทียบ git กับระบบควบคุมเวอร์ชันที่รวมศูนย์เช่นการโค่นล้ม
การโค่นล้ม
ในการโค่นล้มคุณสามารถเลือกที่จะส่งไฟล์บางไฟล์ของสำเนาการทำงานของคุณ แต่มีเพียงไฟล์ที่สมบูรณ์ ตอนนี้: ถ้าคุณต้องการจัดไฟล์A
ไม่ใช่ไฟล์B
และส่วนของไฟล์C
ที่เกี่ยวข้องกับไฟล์A
แต่ไม่ใช่ส่วนที่ขึ้นอยู่กับการเปลี่ยนแปลงในไฟล์B
(ตั้งแต่นั้นคุณจะมีปัญหากับการยอมรับความสอดคล้อง)
Git
Git แก้ปัญหานี้โดยการจัดเตรียมเป็นแบบสำเนาการทำงานที่สอง ภายในพื้นที่จัดเตรียมคุณกำลังรวบรวมสแนปชอตที่คุณจะยอมรับ (พูดโดยประมาณ)
ดังนั้นภายในพื้นที่การแสดงละครคุณสามารถสร้างสแน็ปช็อตที่มีการเปลี่ยนแปลงA
และเวอร์ชันของไฟล์C
ที่แสดงถึงการเปลี่ยนแปลงA
เท่านั้น
สำหรับคำถามเฉพาะ
คุณสามารถจัดแสดง ณ จุดใดก็ได้ที่คุณต้องการ ฉันชอบที่จะแสดงบนเวทีก่อนที่ฉันจะลงมือทำ
เมื่อมีการเปลี่ยนแปลงในไฟล์ฉากแล้วเปลี่ยนไฟล์นั้นในสำเนาทำงานคุณยังไม่ได้เปลี่ยนไฟล์ฉากแน่นอน คุณสามารถตัดสินใจว่าจะจัดเวทีเหล่านั้นด้วยหรือไม่ที่จะจัดเวทีการเปลี่ยนแปลงเหล่านั้น คือถ้าคุณเรียกใช้git gui citool
คุณจะเห็นความแตกต่างของฉากที่จัดฉากและไม่จัดฉาก
Git ระวังที่นี่ซึ่งอาจเป็นสิ่งที่ดี
กลยุทธ์การมอบอำนาจทั่วไป: มอบเป็นสัญญา
ฉันคิดว่าเมื่อพูดถึงคำถาม "ฉันควรจะจัดฉาก" เมื่อใดควรพูดถึงการสร้างนิสัย
ศูนย์รวม VCS
ในระบบควบคุมเวอร์ชันรวมศูนย์ที่คุณมอบให้กับเซิร์ฟเวอร์ส่วนกลางเป็นสิ่งสำคัญสำหรับเพื่อนร่วมงานของคุณที่การกระทำของคุณเสร็จสมบูรณ์และผ่านการทดสอบเป็นอย่างดี ดังนั้นผู้คนจะพยายามที่จะไม่ทำบ่อย ๆ และจากนั้นก็ยอมรับสถานะของไฟล์ที่สมบูรณ์เพื่อลดความเป็นไปได้ของข้อผิดพลาด ดังนั้นการกระทำมักจะเป็นชิ้นใหญ่ซึ่งรวมถึงการเปลี่ยนแปลงมากมาย (ถ้าไม่ใช่การแก้ไขแบบง่าย) การเปลี่ยนแปลงในการกระทำสามารถไม่เกี่ยวข้องทั้งหมด
Git
ใน Git การคอมมิชชันจะดำเนินการแบบโลคัลเพียงแค่ส่งออกไปยังเซิร์ฟเวอร์ทำให้เป็นสาธารณะ ดังนั้นความมุ่งมั่นจึงมีราคาถูกในแง่หนึ่ง กระทำในแง่การโค่นล้มค่อนข้างเทียบเคียงได้กับหลาย ๆตามมาด้วยgit commit
git push
ความแตกต่างนี้มีความสำคัญ
Git อนุญาตให้คุณรับรหัสบรรทัดเดียวแม้ว่าคุณจะเปลี่ยนบรรทัดอื่นในไฟล์เดียวกันก็ตาม สิ่งนี้ให้ประโยชน์มากมายกับคุณเช่นคุณสามารถคอมมิทบูทความปลอดภัยในบรรทัดที่ 100 ในขณะที่มีการเปลี่ยนบรรทัด 300-350 แนะนำคุณสมบัติใหม่
- คุณสามารถแยกการเปลี่ยนแปลงที่แตกต่างกันในการกระทำที่แตกต่างกัน สิ่งนี้แยกได้อย่างชัดเจนในประวัติรุ่นของคุณและยังช่วยให้คุณสามารถย้อนกลับได้
- ความมุ่งมั่นของคุณไม่จำเป็นต้องสะท้อนให้เห็นถึงสถานะ "การรวบรวม" ของสำเนาการทำงานของคุณ (แม้ว่าฉันจะพยายามเก็บไว้เป็นอย่างนั้น)
ดังนั้น "การควบคุมคุณภาพ" และการรับประกันการสร้างในการกระทำที่ผู้ใช้โค่นล้มคาดหวังคืออะไร? มันเปลี่ยนไปเป็นการกระทำอื่น ๆ ในคอมไพล์ คุณยังคงต้องการที่จะผลักดันสถานะการทำงานของโปรแกรมในที่เก็บสาธารณะ ดังนั้นคุณต้องแน่ใจว่าการทดสอบนั้นสำเร็จและโปรแกรมจะทำงานก่อนที่จะทำการเปลี่ยนแปลง
นอกจากนี้พยายามใช้ประโยชน์จากสาขาให้สูงสุด เมื่อทำการเปลี่ยนแปลงเล็ก ๆ จำนวนมากคุณจะพบกับประวัติรุ่นที่ยิ่งใหญ่ หากคุณทำงานในสาขาคุณสามารถจัดหมวดหมู่การคอมมิทย่อยเหล่านั้นด้วยชื่อสาขาแล้วผสานกลับ (ตัวเลือก--no-ff
จะยังคงรักษาไว้ว่าฟีเจอร์เหล่านี้อาศัยอยู่ในสาขาที่ไม่ซ้ำกัน)
คือคุณสามารถทำให้นิสัยของการรวมกับmaster
สาขาเท่านั้นหากสาขาอยู่ในสถานะที่ดี คุณยังสามารถใช้แท็กเพื่อติดตามเหตุการณ์สำคัญและการเปิดตัว
ตอนนี้เพื่อกลับไปที่ staging: เมื่อคุณคอมเม้นท์ไม่กี่บรรทัดต่อคอมมิชชันคุณจะสเตจโดยตรงก่อนที่จะคอมมิท (อย่างน้อยนั่นก็เป็นวิธีที่ฉันทำ)
git diff
และgit diff --cached
ดี แต่บางครั้งฉันต้องการมากกว่านี้)