หมายเหตุ: หนึ่งในความแตกต่างที่ใหญ่ที่สุดระหว่าง Git และ Mercurial คือการแสดงตนที่ชัดเจนของดัชนีหรือการแสดงละครในพื้นที่
จากMercurial สำหรับผู้ใช้ Git :
Git เป็นDistributedSCMเดียวที่แสดงแนวคิดของดัชนีหรือพื้นที่จัดเตรียม ผู้อื่นอาจนำไปใช้และซ่อนไว้ แต่ในกรณีอื่นผู้ใช้ไม่ทราบและไม่ต้องจัดการกับมัน
การเทียบเท่าคร่าวๆของ Mercurial คือสิ่งDirState
ที่ควบคุมข้อมูลสถานะการคัดลอกการทำงานเพื่อกำหนดไฟล์ที่จะรวมในคอมมิตถัดไป แต่ไม่ว่าในกรณีใดไฟล์นี้จะได้รับการจัดการโดยอัตโนมัติ
นอกจากนี้ยังมีความเป็นไปได้ที่จะเลือกได้มากขึ้นในเวลาคอมมิตโดยการระบุไฟล์ที่คุณต้องการคอมมิตในบรรทัดคำสั่งหรือโดยใช้ไฟล์RecordExtension
.
หากคุณรู้สึกอึดอัดในการจัดการกับดัชนีคุณกำลังเปลี่ยนไปในทางที่ดีขึ้น ;-)
เคล็ดลับคือคุณต้องเข้าใจดัชนีเพื่อใช้ประโยชน์จาก Git อย่างเต็มที่ เนื่องจากบทความนี้ตั้งแต่เดือนพฤษภาคม 2549เตือนเราแล้ว (และตอนนี้ก็ยังเป็นจริง):
“ ถ้าคุณปฏิเสธดัชนีแสดงว่าคุณปฏิเสธคอมไพล์ตัวเองจริงๆ”
ตอนนี้บทความนั้นมีคำสั่งมากมายซึ่งตอนนี้ใช้งานง่ายกว่า (ดังนั้นอย่าพึ่งพาเนื้อหามากเกินไป;)) แต่แนวคิดทั่วไปยังคงอยู่:
คุณกำลังดำเนินการกับคุณลักษณะใหม่และเริ่มทำการแก้ไขเล็กน้อยในไฟล์
# working, add a few lines
$ git add myFile
# working, another minor modification
$ git add myFile
ณ จุดนี้การคอมมิตครั้งต่อไปของคุณจะดำเนินการแก้ไขเล็กน้อย 2 รายการในสาขาปัจจุบัน
# working, making major modification for the new features
# ... damn! I cannot commit all this in the current branch: nothing would work
$ git commit
บันทึกเฉพาะการเปลี่ยนแปลงที่เพิ่มลงในพื้นที่การจัดเตรียม (ดัชนี) ณ จุดนี้ไม่ใช่การเปลี่ยนแปลงหลักที่ปรากฏในไดเร็กทอรีการทำงานของคุณ
$ git branch newFeature_Branch
$ git add myFile
การคอมมิตครั้งต่อไปจะบันทึกการเปลี่ยนแปลงที่สำคัญอื่น ๆ ทั้งหมดใน 'newFrature_Branch' สาขาใหม่
ตอนนี้การเพิ่มแบบโต้ตอบหรือแม้กระทั่งการแยกคอมมิตเป็นคุณสมบัติที่ใช้ได้กับ Mercurial ผ่านhg record
คำสั่ง '' หรือส่วนขยายอื่น ๆ : คุณจะต้องติดตั้งRecordExtension
หรือCrecordExtension
.
แต่นี่ไม่ใช่ส่วนหนึ่งของเวิร์กโฟลว์ปกติสำหรับ Mercurial
Git ดูคอมมิตเป็นชุดของ " การเปลี่ยนแปลงเนื้อหาไฟล์ " และให้คุณเพิ่มการเปลี่ยนแปลงเหล่านั้นทีละรายการ
คุณควรศึกษาว่าคุณลักษณะและผลของมัน: ส่วนใหญ่ของการใช้พลังงาน Git (เช่นความสามารถในการย้อนกลับผสาน (หรือแบ่งครึ่งปัญหาหรือย้อนกลับไปกระทำ) , ตรงกันข้ามกับ Mercurial ) มาจากที่ "เนื้อหาของแฟ้ม" กระบวนทัศน์
ตันฟา (ในโปรไฟล์: "Hg dev, pythonist": figures ... ) ในความคิดเห็น:
ไม่มีอะไรโดยพื้นฐาน "git-ish" ในดัชนี hg สามารถใช้ดัชนีได้หากเห็นว่ามีคุณค่าในความเป็นจริงmq
หรือshelve
เป็นส่วนหนึ่งของสิ่งนั้นอยู่แล้ว
โอ้เด็ก. ที่นี่เราไปอีกครั้ง
อย่างแรกฉันไม่ได้มาที่นี่เพื่อทำให้เครื่องมือหนึ่งดูดีกว่าอีกเครื่องมือหนึ่ง ฉันพบว่า Hg ยอดเยี่ยมใช้งานง่ายมากพร้อมการสนับสนุนที่ดี (โดยเฉพาะบน Windows ซึ่งเป็นแพลตฟอร์มหลักของฉันแม้ว่าฉันจะทำงานบน Linux และ Solaris8 หรือ 10 ด้วยก็ตาม)
ดัชนีอยู่ด้านหน้าและตรงกลางในแบบที่Linus Torvalds ทำงานร่วมกับ VCS :
Git ใช้การอัปเดตดัชนีที่ชัดเจนตั้งแต่วันที่ 1 ก่อนที่จะทำการรวมครั้งแรก เป็นเพียงวิธีที่ฉันทำงานมาตลอด ฉันมักจะมีต้นไม้สกปรกโดยมีแพทช์แบบสุ่มในทรีที่ฉันไม่ต้องการกระทำเพราะเป็นเพียงการอัปเดต Makefile สำหรับเวอร์ชันถัดไป
ตอนนี้การรวมกันของดัชนี (ซึ่งไม่ใช่ความคิดที่เห็นเฉพาะใน Git) และกระบวนทัศน์ "content is king" ทำให้มีลักษณะเฉพาะและ "git-ish" :
git เป็นตัวติดตามเนื้อหาและชื่อไฟล์ไม่มีความหมายเว้นแต่จะเชื่อมโยงกับเนื้อหา ดังนั้นลักษณะการทำงานที่ดีเพียงอย่างเดียวสำหรับ git add filename คือการเพิ่มเนื้อหาของไฟล์รวมทั้งชื่อลงในดัชนี
หมายเหตุ: "เนื้อหา" ที่นี่กำหนดไว้ดังนี้ :
ดัชนีของ Git นั้นถูกกำหนดไว้เป็นอย่างมาก
- เพียงพอที่จะมี " เนื้อหา " ทั้งหมดของโครงสร้าง (ซึ่งรวมถึงข้อมูลเมตาทั้งหมด: ชื่อไฟล์โหมดและเนื้อหาของไฟล์ล้วนเป็นส่วนหนึ่งของ "เนื้อหา" และทั้งหมดนี้ไม่มีความหมายในตัวของมันเอง! )
- ข้อมูล "stat" เพิ่มเติมเพื่อให้สามารถเพิ่มประสิทธิภาพการเปรียบเทียบระบบไฟล์ที่ชัดเจนและไม่สำคัญ (แต่สำคัญอย่างยิ่ง!)
ดังนั้นคุณควรดูดัชนีเป็นเป็นเนื้อหา
เนื้อหาไม่ใช่ "ชื่อไฟล์" หรือ "เนื้อหาไฟล์" เป็นส่วนแยกต่างหาก คุณไม่สามารถแยกทั้งสองอย่างออกจากกันได้
ชื่อไฟล์ด้วยตัวเองก็ไม่สมเหตุสมผล (ต้องมีเนื้อหาไฟล์ด้วย) และเนื้อหาไฟล์ในตัวเองก็ไร้เหตุผลเช่นเดียวกัน (คุณต้องรู้วิธีเข้าถึง)
สิ่งที่ฉันพยายามจะบอกคือโดยพื้นฐานแล้ว git ไม่อนุญาตให้คุณเห็นชื่อไฟล์ที่ไม่มีเนื้อหา ความคิดทั้งหมดเป็นบ้าและไม่ถูกต้อง ไม่มีความเกี่ยวข้องกับ "ความเป็นจริง"
จากคำถามที่พบบ่อยข้อดีหลัก ๆ คือ:
- กระทำด้วยความละเอียด
- ช่วยให้คุณสามารถปรับเปลี่ยนต้นไม้ของคุณโดยไม่ได้ตั้งใจเป็นเวลานานพอสมควร
- ดำเนินการขั้นตอนเล็ก ๆ หลายขั้นตอนสำหรับการคอมมิตเดียวตรวจสอบสิ่งที่คุณทำ
git diff
และตรวจสอบความถูกต้องของแต่ละขั้นตอนย่อยด้วยgit add
หรือgit add -u
หรือ
git diff --base
ช่วยให้การจัดการที่ดีของความขัดแย้งผสาน: git diff --ours
, git diff --theirs
,
- อนุญาตให้
git commit --amend
แก้ไขเฉพาะข้อความบันทึกหากดัชนียังไม่ได้รับการแก้ไขในระหว่างนี้
โดยส่วนตัวแล้วฉันคิดว่าพฤติกรรมนี้ไม่ควรเป็นค่าเริ่มต้นคุณต้องการให้ผู้คนกระทำสิ่งที่ผ่านการทดสอบหรืออย่างน้อยก็รวบรวม
ในขณะที่คุณพูดถูกโดยทั่วไป (เกี่ยวกับส่วน "ทดสอบหรือคอมไพล์") วิธีที่ Git ช่วยให้คุณสามารถแยกสาขาและรวม (การเลือกเชอร์รี่หรือการรีเบต) ช่วยให้คุณสามารถคอมมิตได้บ่อยเท่าที่คุณต้องการในสาขาส่วนตัวชั่วคราว (ผลักดันเท่านั้น ไปยังที่เก็บ "สำรองข้อมูล" ระยะไกล) ในขณะที่ทำ "การกระทำที่น่าเกลียด" เหล่านั้นซ้ำในสาขาสาธารณะโดยมีการทดสอบที่ถูกต้องทั้งหมด