Differences between revisions 2 and 3
Revision 2 as of 2008-11-19 15:42:53
Size: 13965
Comment: Changed tutorial index link to Thai index
Revision 3 as of 2008-11-21 09:31:14
Size: 14875
Comment: Edit contents to make reading easier.
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
''(หน้านี้เป็นหน้าที่ 4 จาก 9 ของ[:ThaiTutorial:บทเรียน]การใช้งาน Mercurial  หน้าก่อนหน้าคือ [:ThaiTutorialHistory], หน้าถัดไปคือ [:ThaiTutorialShareChange])'' ''(บทนี้เป็นบทที่ 4 จาก 9 บทของ[:ThaiTutorial:บทเรียนการใช้งาน Mercurial] บทก่อนหน้าคือ [:ThaiTutorialHistory:ดูประวัติการแก้ไขใน repository], บทถัดไปคือ [:ThaiTutorialShareChange:แบ่งปันสิ่งที่คุณแก้ไขกับ repository อื่น])''
Line 5: Line 5:
ต่อจาก ThaiTutorialHistory ตอนนี้เราอยู่ใน `my-hello` repository ที่เราทำสำเนามาตอ ThaiTutorialClone. ต่อจาก[:ThaiTutorialHistory:บทที่แล้ว] ตอนนี้เราอยู่ใน repository `my-hello` ที่เราเพิ่งทำสำเนามา[:ThaiTutorialClone:บทที่ 2]
Line 7: Line 7:
วิธีการใช้ Mercurial สำหรับพัฒนาโปรแกรมที่ดีก็คือการแยกการแก้ไขที่เกี่ยวข้องกันออกมาเป็น [:Repository:repository] ต่างหาก (ดู [:WorkingPractices]) การทำแบบนี้จะช่วยให้การแก้ไขเรื่องต่างๆกันไม่มาปนกันอยู่ใน repository เดียวและทำให้ง่ายต่อการทดสอบ เรามาลองเริ่มแก้ไขโดยใช้วิธีนี้กันดู วิธีการใช้ Mercurial ที่ดีสำหรับการพัฒนาโปรแกรมก็คือการแยกการแก้ไขที่เกี่ยวข้องกันออกมาเป็น [:Repository:repository] ต่างหาก (ดู [:WorkingPractices]) การทำแบบนี้จะช่วยให้การแก้ไขเรื่องต่างๆกันไม่มาปนกันอยู่ใน repository เดียวและทำให้ง่ายต่อการทดสอบ เรามาลองเริ่มแก้ไขโดยใช้วิธีนี้กันดู
Line 9: Line 9:
จุดประสงค์(อันยิ่งใหญ่)ของเราก็คือ...ให้โปรแกรม "hello, world" เราพิมพ์ผลลัพธ์เพิ่มอีกบรรทัดนึง ก่อนอื่นให้เราสร้าง repository ใหม่ชื่อ `my-hello-new-output` โดย[:Clone:ทำสำเนา]จาก `my-hello` (ผลลัพธ์ที่แสดงมาจาก Mercurial 1.0): จุดประสงค์(อันยิ่งใหญ่)ของเราก็คือ...ให้โปรแกรม "hello, world" เราพิมพ์ผลลัพธ์เพิ่มอีกบรรทัดนึง ก่อนอื่นให้เราสร้าง repository ใหม่ชื่อ `my-hello-new-output` โดย[:Clone:ทำสำเนา]จาก `my-hello` (ผลลัพธ์ที่ได้มาจาก Mercurial 1.0):
Line 17: Line 17:
สังเกตุว่าเราได้ตั้งชื่อสำหรับ repository ใหม่ด้วยชื่อที่สื่อความหมายเพื่อบ่งบอกว่าเราจะใช้ repository ใหม่นี้เพื่ออะไร เนื่องจากว่าการทำสำเนาใน Mercurial นั้นง่ายมากเราอาจจะทำสำเนา repository ต่างๆมากมายระหว่างการทำงาน ถ้าเราไม่ตั้งชื่อ repository เหล่าน้ให้ดี เราอาจจะลืมได้ว่า repository แต่ละอันมีไว้เพื่ออะไร (ดู RepositoryNaming) สังเกตุว่าเราได้ตั้งชื่อสำหรับ repository ใหม่ด้วยชื่อที่สื่อความหมายเพื่อบ่งบอกว่าเราจะใช้ repository ใหม่นี้เพื่ออะไร เนื่องจากว่าการทำสำเนาใน Mercurial นั้นง่ายมากเราอาจจะทำสำเนา repository ต่างๆมากมายระหว่างการทำงาน ถ้าเราไม่ตั้งชื่อ repository ให้ดเราอาจจะลืมได้ว่า repository แต่ละอันมีไว้เพื่ออะไร (ดู RepositoryNaming)
Line 19: Line 19:
โอเค ถึงเวลาที่เราจะทำการแก้ไขใน repository ใหม่ล่ะ เข้าไปใน[:WorkingDirectory:ไดเร็คทอรี่ทำงาน] (working directory) ของ repository ซึ่งเป็นชื่อเรียกสั้นๆสำหรับไดเร็คทอรี่ที่มีไฟล์อยู่นั่นแหละ จากนั้นก็แก้ไขซอร์สโค้ดด้วย text editor ตัวโปรดของคุณ: โอเค ถึงเวลาที่เราจะทำการแก้ไขใน repository ใหม่ล่ะ เข้าไปใน[:WorkingDirectory:ไดเร็คทอรี่สำหรับใช้ทำงาน]ของ repository จากนั้นก็แก้ไขซอร์สโค้ดด้วยโปรแกรมตัวโปรดของคุณ:
Line 60: Line 60:
หลังจากแก้ไขเสร็จก็ออกจาก editor ของเราก็เรียบร้อย เราพร้อมที่จะสร้าง [:ChangeSet:changeset] ใหม่แล้ว หลังจากแก้ไขเสร็จก็บันทึกไฟล์และออกจากโปรแกรมของเรา ตอนนี้เราก็พร้อมที่จะสร้าง[:ChangeSet:เซ็ตการแก้ไข]ใหม่แล้ว
Line 62: Line 62:
แต่จะเกิดอะไรขึ้นถ้าเกิดมีคนมาขัดจังหวะแล้วเราดันลืมไปว่าอะไรบ้างที่ถูกแก้ไขที่จะอยู่ใน changeset ล่ะ? คำตอบอู่ในคำสั่ง `status` แต่จะเกิดอะไรขึ้นถ้าเกิดมีคนมาขัดจังหวะแล้วเราดันลืมไปว่าอะไรจะถูกคอมมิทไปบ้างล่ะ? ไม่งห่วง เพราะเราังมีคำสั่ง `status`
Line 69: Line 69:
ผลลัพธ์จากคำสั่งนั้นสั้นๆ ตัวอักษร `M` บอกเราว่าไฟล์ `hello.c` ได้ถูกแก้ไข (modified) และการแก้ไขนี้ก็พร้อมที่จะเข้าไปอยู่ใน changeset ผลลัพธ์จากคำสั่งแค่สั้นๆ ตัวอักษร `M` บอกเราว่าไฟล์ `hello.c` ได้ถูกแก้ไข (modified) และการแก้ไขนี้จะอยู่ในเซ็ตการไขเมื่อเราคอมมิท
Line 71: Line 71:
ถ้าคุณขี้เกียจพิมพ์คำสั่งยาวๆแบบ `hg status` ก็สามารถใช้คำสั่งสั้นๆ `hg st` แทนเพราะ Mercurial อนุญาติให้เราย่อคำสั่งได้ถ้คำสั่งที่ย่อลงนัไม่กำกวมเวลา Mercurial แปลความหมาย ถ้าคุณขี้เกียจพิมพ์คำสั่งยาวๆแบบ `hg status` ก็สามารถใช้คำสั่งแบบย่อ `hg st` ได้เพราะ Mercurial อนุญาติให้เราย่อคำสั่งได้ตรบใดที่พอย่อล้ไม่กำกวมสำหรับ Mercurial
Line 78: Line 78:
หรือเราอาจจะอยากดูเนื้หาที่ถูกแก้ไขโดยใช้คำสั่ง `diff`: ถ้าเราอาจจะอยากดูว่ามีะไรถูกแก้ไขไปบ้างก็ใช้คำสั่ง `diff`:
Line 94: Line 94:
<!> ในกรณีที่เราอยากยกเลิกสิ่งที่เราแก้ไขและเริ่มต้นใหม่ เราสามารถใช้คำสั่ง `revert` เพื่อดึงไฟล์ `hello.c` ก่อนที่จะถูกแก้ไขกลับมาได้ (หรือจะใช้ตัวเลือก `--all` เพื่อดึงเวอร์ชั่นก่อนแก้ไขของทุกๆไฟล์กลับมา) เช็คให้แน่ใจก่อนล่ะว่านี่เป็นสิ่งที่คุณอยากทำจริงๆ (ดู [:Revert]). <!> ในกรณีที่เราอยากยกเลิกสิ่งที่เราแก้ไขและเริ่มต้นใหม่เราสามารถใช้คำสั่ง `revert` เพื่อดึงไฟล์ `hello.c` ก่อนที่จะถูกแก้ไขกลับมาได้ (หรือจะใช้ตัวเลือก `--all` เพื่อดึงเวอร์ชั่นก่อนแก้ไขของทุกๆไฟล์กลับมา) เช็คให้แน่ใจก่อนล่ะว่านี่เป็นสิ่งที่เราอยากทำจริงๆ (ดู [:Revert]).
Line 100: Line 100:
`revert` เปลี่ยนชื่อไฟล์ที่ถูกแก้ไขจาก `hello.c` เป็น `hello.c.orig` และกู้ไฟล์ `hello.c` ก่อนที่จะถูกแก้ไขกลับมาแทน คำสั่ง `revert` จะเปลี่ยนชื่อไฟล์ที่ถูกแก้ไขจาก `hello.c` เป็น `hello.c.orig` และกู้ไฟล์ `hello.c` เวอร์ชั่นก่อนที่จะถูกแก้ไขกลับมาแทน
Line 102: Line 102:
ังกยกเลิกการแก้ไข คำสั่ง `status` ก็แสดงสถานะของไฟล์ `hello.c.orig` ว่าเป็นไฟล์ที่ไม่ถูกติดตามโดย Mercurial ล่ะ (นำหน้า้วยเครื่องหมาย "?"). ะเมื่อเรายกเลิกการแก้ไขคำสั่ง `status` จะแสดงสถานะของไฟล์ `hello.c.orig` ว่าเป็นไฟล์ที่ไม่ถูกเก็บประวัติโดย Mercurial (ดยแสดงเครื่องหมาย "?" นำหน้าชื่อไฟล์)
Line 109: Line 109:
ถ้าเราเกิดเปลี่ยนใจและอยากใช้ไฟล์ที่เราเพิ่งแก้ไป ก็แค่ลบไฟล์ `hello.c` ทิ้งและเปลี่ยนชื่อไฟล์ `hello.c.orig` เป็น `hello.c` เท่านี้ก็เรียบร้อย ถ้าเราเกิดเปลี่ยนใจและอยากใช้ไฟล์ที่เราเพิ่งแก้ไปก็แค่ลบไฟล์ `hello.c` ทิ้งและเปลี่ยนชื่อไฟล์ `hello.c.orig` เป็น `hello.c` เท่านี้ก็เรียบร้อย
Line 118: Line 118:
การสร้าง changeset มีชื่อเรียกอีกชื่อนึงว่าการ [:Commit:คอมมิท] changeset การสร้างเซ็ตการแก้ไขมีชื่อเรียกอีกชื่อนึงว่าการ[:Commit:คอมมิท]เซ็ตการแก้ไขนั้น
Line 120: Line 120:
คำสั่ง `commit` นี้มีชื่อย่อสั้นๆว่า: `ci` ("check in"),
เพราะั้นเราสามารถใช้คำสั่งแบบย่อนี้ได้:
คำสั่ง `commit` นี้มีชื่อย่อว่า: `ci` ("check in"),
เพราะฉะนั้นเราสามารถใช้คำสั่งแบบย่อนี้ได้:
Line 127: Line 127:
คำสั่งนี้จะเปิด editor ขึ้นมาพร้อมกับบรรทัดแปลกๆสองสามบรรทัด คำสั่งนี้จะเปิดโปรแกรม editor ขึ้นมาพร้อมกับบรรทัดแปลกๆสองสามบรรทัด
Line 129: Line 129:
''หมายเหตุ:'' editor ที่ Mercurial ใช้โดยปกติคือ `vi`  แต่เราสามารถเปลี่ยนค่าได้โดยเซ็ตตัวแปร environment ที่ชื่อ `EDITOR` หรือ [:HGEDITOR] ''หมายเหตุ:'' โปรแกรม editor ที่ Mercurial ใช้โดยปกติคือ `vi` แต่เราสามารถเปลี่ยนค่านี้ได้ได้โดยตั้งค่าตัวแปร environment ที่ชื่อ `EDITOR` หรือ [:HGEDITOR]
Line 140: Line 140:
บรรทัดแรกของ editor จะเป็นบรรทัดว่างๆ ไว้ให้เราใส่คำอธิบายของ changeset นี้ ส่วนบรรทัดต่อๆไปก็จะบอกชื่อผู้ใช้ ชื่อ branch และไฟล์ต่างๆที่อย่ใน changeset นี้ บรรทัดแรกของ editor จะเป็นบรรทัดว่างๆ ไว้ให้เราใส่คำอธิบายของเซ็ตการแก้ไขนี้ ส่วนบรรทัดต่อๆไปก็จะบอกชื่อผู้ใช้ ชื่อกิ่งของไดเร็คทอรี่สำหรับใช้งาน และไฟล์ต่างๆที่จะถกคอมมิทในไดเร็คทอรี่สำหรับใช้ทำงานนี้
Line 142: Line 142:
ปกติชื่อของ branch คือ "default" (ดู NamedBranches) Mercurial เอาค่า "user" มาจากไฟล์การตั้งค่า {{{~/.hgrc}}} ภายต้ค่าที่ชื่อ "username" ของส่วน "ui" (ดู [http://www.selenic.com/mercurial/hgrc.5.html#ui hgrc(5)]) แต่เราก็สามารถระบุชื่อผู้ใช้องเราเองได้โดยใช้ตัวเลือก -u (ดู `hg help ci` หรือ [http://www.selenic.com/mercurial/hg.1.html#commit hg.1.html#commit]) ปกติชื่อของกิ่งคือ "default" (ดู NamedBranches) Mercurial เอาค่า "user" มาจากไฟล์ {{{~/.hgrc}}} จากค่าของ "username" ส่วน "ui" (ดู [http://www.selenic.com/mercurial/hgrc.5.html#ui hgrc(5)]) เราสามารถระบุชื่อผู้ใช้ได้เองโดยใช้ตัวเลือก -u (ดู `hg help ci` หรือ [http://www.selenic.com/mercurial/hg.1.html#commit hg.1.html#commit])
Line 144: Line 144:
เพื่อที่จะคอมมิท changeset เราจะต้องใส่คำอธิบาย (ดู [:ChangeSetComments]) ลองพิมพ์อะไรประมาณนี้ดู: เราจะต้องใส่คำอธิบายเพื่อที่จะคอมมิทเซ็ตการแก้ไขแต่ละเซ็ต (ดู [:ChangeSetComments]) ลองพิมพ์อะไรประมาณนี้ดู:
Line 155: Line 155:
หลังจากใส่คำอธิบายเราก็บันทึกและปิด editor ซะและถ้าทุกอย่างเป็นไปด้วยดีคำสั่ง `commit` จะจบการทำงานโดยไม่พิพ์ผลลัพธ์ใดๆออกมา จากนั้นเราต้องบันทึกและปิดโปรแกรม editor ซะและถ้าทุกอย่างเป็นไปด้วยดีคำสั่ง `commit` จะจบการทำงานโดยไม่พิพ์ผลลัพธ์ใดๆออกมา
Line 157: Line 157:
<!> ถ้าคุณออกจาก editor โดยที่ไม่ได้บันทึกหรือไม่ได้พิมพ์คำอธิบายใดๆ คำสั่ง `commit` จะยกเลิกการคอมมิทนั้น ทั้งนี้เพื่อให้คุณสามารถเปลี่ยนใจไม่คอมมิทการแก้ไขของคุณได้ <!> ถ้าคุณออกจากโปรแกรม editor โดยที่ยังไม่ได้บันทึกหรือพิมพ์คำอธิบายใดๆ คำสั่ง `commit` จะยกเลิกการคอมมิท ทั้งนี้เพื่อให้คุณสามารถเปลี่ยนใจไม่คอมมิทการแก้ไขของคุณได้
Line 159: Line 159:
ทีนี้ลองมาดูว่าหลังจากคอมมิทคำสั่ง {{{status}}} จะบอกอะไรกับเรานะ? ลองมาดูว่าหลังจากคอมมิทแล้วคำสั่ง {{{status}}} จะบอกอะไรกับเรานะ?
Line 165: Line 165:
ไม่มีอะไรเลย! สิ่งที่เราแก้ไขได้ถูกคอมมิทเป็น changeset แล้วเพราะฉะนั้นจึงไม่มีไฟล์ใดๆที่ถูกแก้และยังไม่ได้ถูกคอมมิท  และ[:Tip:ปลาย] repository ของเราก็ตรงกับไดเร็คทอรี่งานด้วย ไม่มีอะไรเลย! สิ่งที่เราแก้ไขได้ถูกคอมมิทเป็นเซ็ตการแก้ไขแล้วเพราะฉะนั้นจึงไม่มีไฟล์ใดๆที่ถูกแก้และยังไม่ได้ถูกคอมมิท นอกจากนั้น[:Tip:ส่วนปลาย]ของ repository ของเราก็ตรงกับไดเร็คทอรี่หรับใช้ทำงานแล้วด้วย
Line 167: Line 167:
นอกจากนั้นคำสั่ง [:Parent:parents] บอกกับเราว่าไดเร็คทอรี่ำงานของ repository เราตรงกับ changeset ที่ถูกคอมมิทล่าสุดแล้ว (ดู [:Update]) ด้วย (ในที่นี้เรามีแค่บรรพบุรุษอันเดียว ซึ่งก็เป็นกรณีปกติหลังจากคอมมิท เราจะเห็นบรรพบุรุษสองอันใน ThaiTutorialMerge): เรายังสามารถใช้คำสั่ง [:Parent:parents] เพื่อดูว่าไดเร็คทอรี่หรับใช้ทำงานของเราก็ตรงกับเซ็ทการแก้ไขที่ถูกคอมมิทล่าสุดแล้วเช่นกัน (ลองดู [:Update] ด้วย) (ในกรณีนี้เรามีบรรพบุรุษแค่อันเดียวซึ่งก็เป็นปกติหลังจากคอมมิท เราจะได้เห็นบรรพบุรุษสองอันในบท[:ThaiTutorialMerge:รวมประวัติการแก้ไขที่ขัดแย้งกัน]):
Line 178: Line 178:
ท่านี้ล่ะ!  เราได้คอมมิท changeset ใหม่เข้าไปใน repository เรียบร้อยแล้ว โอ! เราได้คอมมิทเซ็ตการแก้ไขใหม่เข้าไปใน repository เรียบร้อยแล้ว
Line 180: Line 180:
เราสามารถดูประวัติการแก้ไขของเราได้: ลองมาดูประวัติการแก้ไขของเรากัน:
Line 192: Line 192:
''หมายเหตุ:'' ชื่อผู้ใช้, วันที่, และ [:ChangeSetID:changeset ID] อาจต่างกันไปได้จากที่คุณทดลอง ''หมายเหตุ:'' ชื่อผู้ใช้, วันที่, และ [:ChangeSetID:รหัสประจำเซ็ตการแก้ไข]อาจต่างไปในเครืองของคุณ
Line 194: Line 194:
จากที่เราได้เรียนใน [:ThaiTutorialClone] changeset ใหม่นี้จะอยู่แค่ใน repository นี้เท่านั้น ข้อเท็จจริงนี้นี้เป็นส่วนสำคัญมากในการเข้าใจการทำงานของ Mercurial จากที่เราได้เรียนในบท [:ThaiTutorialClone:ทำสำเนา repository ที่มีอยู่] เราจะเห็นว่าเซ็ตการแก้ไขใหม่นี้จะอยู่แค่ใน repository นี้เท่านั้น จุดนี้เป็นจุดที่สำคัญมากในการทำความเข้าใจการทำงานของ Mercurial
Line 196: Line 196:
ถ้าเราต้องการแบ่งปันการแก้ไขนี้ เราจะต้องอ่านต่อที่ ThaiTutorialShareChange อ่านบทต่อไปได้เลยเพื่อ [:ThaiTutorialShareChange:แบ่งปันสิ่งที่เราแก้ไขกับ repository อื่น]

บทเรียน - ทำการแก้ไขแรก

(บทนี้เป็นบทที่ 4 จาก 9 บทของ[:ThaiTutorial:บทเรียนการใช้งาน Mercurial] บทก่อนหน้าคือ [:ThaiTutorialHistory:ดูประวัติการแก้ไขใน repository], บทถัดไปคือ [:ThaiTutorialShareChange:แบ่งปันสิ่งที่คุณแก้ไขกับ repository อื่น])

ต่อจาก[:ThaiTutorialHistory:บทที่แล้ว] ตอนนี้เราอยู่ใน repository my-hello ที่เราเพิ่งทำสำเนามาใน[:ThaiTutorialClone:บทที่ 2]

วิธีการใช้ Mercurial ที่ดีสำหรับการพัฒนาโปรแกรมก็คือการแยกการแก้ไขที่เกี่ยวข้องกันออกมาเป็น [:Repository:repository] ต่างหาก (ดู [:WorkingPractices]) การทำแบบนี้จะช่วยให้การแก้ไขเรื่องต่างๆกันไม่มาปนกันอยู่ใน repository เดียวและทำให้ง่ายต่อการทดสอบ เรามาลองเริ่มแก้ไขโดยใช้วิธีนี้กันดู

จุดประสงค์(อันยิ่งใหญ่)ของเราก็คือ...ให้โปรแกรม "hello, world" เราพิมพ์ผลลัพธ์เพิ่มอีกบรรทัดนึง ก่อนอื่นให้เราสร้าง repository ใหม่ชื่อ my-hello-new-output โดย[:Clone:ทำสำเนา]จาก my-hello (ผลลัพธ์ที่ได้มาจาก Mercurial 1.0):

$ hg clone my-hello my-hello-new-output
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved

สังเกตุว่าเราได้ตั้งชื่อสำหรับ repository ใหม่ด้วยชื่อที่สื่อความหมายเพื่อบ่งบอกว่าเราจะใช้ repository ใหม่นี้เพื่ออะไร เนื่องจากว่าการทำสำเนาใน Mercurial นั้นง่ายมากเราอาจจะทำสำเนา repository ต่างๆมากมายระหว่างการทำงาน ถ้าเราไม่ตั้งชื่อ repository ให้ดีๆเราอาจจะลืมได้ว่า repository แต่ละอันมีไว้เพื่ออะไร (ดู RepositoryNaming)

โอเค ถึงเวลาที่เราจะทำการแก้ไขใน repository ใหม่ล่ะ เข้าไปใน[:WorkingDirectory:ไดเร็คทอรี่สำหรับใช้ทำงาน]ของ repository จากนั้นก็แก้ไขซอร์สโค้ดด้วยโปรแกรมตัวโปรดของคุณ:

$ cd my-hello-new-output
$ vi hello.c

เนื้อหาเริ่มต้นของ hello.c เป็นแบบนี้:

/*
 * hello.c
 *
 * Placed in the public domain by Bryan O'Sullivan
 *
 * This program is not covered by patents in the United States or other
 * countries.
 */

#include <stdio.h>

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        return 0;
}

เรามาแก้ main ให้พิมพ์ข้อความอีกบรรทัดนึงกันเถอะ:

(...)

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        printf("sure am glad I'm using Mercurial!\n");
        return 0;
}

หลังจากแก้ไขเสร็จก็บันทึกไฟล์และออกจากโปรแกรมของเรา ตอนนี้เราก็พร้อมที่จะสร้าง[:ChangeSet:เซ็ตการแก้ไข]ใหม่แล้ว

แต่จะเกิดอะไรขึ้นถ้าเกิดมีคนมาขัดจังหวะแล้วเราดันลืมไปว่าอะไรจะถูกคอมมิทไปบ้างล่ะ? ไม่ต้องห่วง เพราะเรายังมีคำสั่ง status

$ hg status
M hello.c

ผลลัพธ์จากคำสั่งแค่สั้นๆ ตัวอักษร M บอกเราว่าไฟล์ hello.c ได้ถูกแก้ไข (modified) และการแก้ไขนี้จะอยู่ในเซ็ตการแก้ไขเมื่อเราคอมมิท

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

$ hg st
M hello.c

ถ้าเราอาจจะอยากดูว่ามีอะไรถูกแก้ไขไปบ้างก็ใช้คำสั่ง diff:

$ hg diff
diff -r 82e55d328c8c hello.c
--- a/hello.c   Fri Aug 26 01:21:28 2005 -0700
+++ b/hello.c   Mon May 05 00:27:56 2008 +0200
@@ -12,5 +12,6 @@
 int main(int argc, char **argv)
 {
        printf("hello, world!\n");
+       printf("sure am glad I'm using Mercurial!\n");
        return 0;
 }

<!> ในกรณีที่เราอยากยกเลิกสิ่งที่เราแก้ไขและเริ่มต้นใหม่เราสามารถใช้คำสั่ง revert เพื่อดึงไฟล์ hello.c ก่อนที่จะถูกแก้ไขกลับมาได้ (หรือจะใช้ตัวเลือก --all เพื่อดึงเวอร์ชั่นก่อนแก้ไขของทุกๆไฟล์กลับมา) เช็คให้แน่ใจก่อนล่ะว่านี่เป็นสิ่งที่เราอยากทำจริงๆ (ดู [:Revert]).

$ hg revert hello.c

คำสั่ง revert จะเปลี่ยนชื่อไฟล์ที่ถูกแก้ไขจาก hello.c เป็น hello.c.orig และกู้ไฟล์ hello.c เวอร์ชั่นก่อนที่จะถูกแก้ไขกลับมาแทน

และเมื่อเรายกเลิกการแก้ไขคำสั่ง status จะแสดงสถานะของไฟล์ hello.c.orig ว่าเป็นไฟล์ที่ไม่ถูกเก็บประวัติโดย Mercurial (โดยแสดงเครื่องหมาย "?" นำหน้าชื่อไฟล์)

$ hg st
? hello.c.orig

ถ้าเราเกิดเปลี่ยนใจและอยากใช้ไฟล์ที่เราเพิ่งแก้ไปก็แค่ลบไฟล์ hello.c ทิ้งและเปลี่ยนชื่อไฟล์ hello.c.orig เป็น hello.c เท่านี้ก็เรียบร้อย

$ rm hello.c
$ mv hello.c.orig hello.c
$ hg st
M hello.c

การสร้างเซ็ตการแก้ไขมีชื่อเรียกอีกชื่อนึงว่าการ[:Commit:คอมมิท]เซ็ตการแก้ไขนั้น เราทำการคอมมิทโดยใช้คำสั่ง commit คำสั่ง commit นี้มีชื่อย่อว่า: ci ("check in"), เพราะฉะนั้นเราสามารถใช้คำสั่งแบบย่อนี้ได้:

$ hg ci

คำสั่งนี้จะเปิดโปรแกรม editor ขึ้นมาพร้อมกับบรรทัดแปลกๆสองสามบรรทัด

หมายเหตุ: โปรแกรม editor ที่ Mercurial ใช้โดยปกติคือ vi แต่เราสามารถเปลี่ยนค่านี้ได้ได้โดยตั้งค่าตัวแปร environment ที่ชื่อ EDITOR หรือ [:HGEDITOR]

HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: --
HG: user: mpm@selenic.com
HG: branch 'default'
HG: changed hello.c

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

ปกติชื่อของกิ่งคือ "default" (ดู NamedBranches) Mercurial เอาค่า "user" มาจากไฟล์ ~/.hgrc จากค่าของ "username" ในส่วน "ui" (ดู [http://www.selenic.com/mercurial/hgrc.5.html#ui hgrc(5)]) เราสามารถระบุชื่อผู้ใช้ได้เองโดยใช้ตัวเลือก -u (ดู hg help ci หรือ [http://www.selenic.com/mercurial/hg.1.html#commit hg.1.html#commit])

เราจะต้องใส่คำอธิบายเพื่อที่จะคอมมิทเซ็ตการแก้ไขแต่ละเซ็ต (ดู [:ChangeSetComments]) ลองพิมพ์อะไรประมาณนี้ดู:

Express great joy at existence of Mercurial
HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: --
HG: user: mpm@selenic.com
HG: branch 'default'
HG: changed hello.c

จากนั้นเราต้องบันทึกและปิดโปรแกรม editor ซะและถ้าทุกอย่างเป็นไปด้วยดีคำสั่ง commit จะจบการทำงานโดยไม่พิมพ์ผลลัพธ์ใดๆออกมา

<!> ถ้าคุณออกจากโปรแกรม editor โดยที่ยังไม่ได้บันทึกหรือพิมพ์คำอธิบายใดๆ คำสั่ง commit จะยกเลิกการคอมมิท ทั้งนี้เพื่อให้คุณสามารถเปลี่ยนใจไม่คอมมิทการแก้ไขของคุณได้

ลองมาดูว่าหลังจากคอมมิทแล้วคำสั่ง status จะบอกอะไรกับเรานะ?

$ hg st

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

เรายังสามารถใช้คำสั่ง [:Parent:parents] เพื่อดูว่าไดเร็คทอรี่สำหรับใช้ทำงานของเราก็ตรงกับเซ็ทการแก้ไขที่ถูกคอมมิทล่าสุดแล้วเช่นกัน (ลองดู [:Update] ด้วย) (ในกรณีนี้เรามีบรรพบุรุษแค่อันเดียวซึ่งก็เป็นปกติหลังจากคอมมิท เราจะได้เห็นบรรพบุรุษสองอันในบท[:ThaiTutorialMerge:รวมประวัติการแก้ไขที่ขัดแย้งกัน]):

$ hg par
changeset:   2:86794f718fb1
tag:         tip
user:        mpm@selenic.com
date:        Mon May 05 01:20:46 2008 +0200
summary:     Express great joy at existence of Mercurial

โอเค! เราได้คอมมิทเซ็ตการแก้ไขใหม่เข้าไปใน repository เรียบร้อยแล้ว

ลองมาดูประวัติการแก้ไขของเรากัน:

$ hg log
changeset:   2:86794f718fb1
tag:         tip
user:        mpm@selenic.com
date:        Mon May 05 01:20:46 2008 +0200
summary:     Express great joy at existence of Mercurial

(...)

หมายเหตุ: ชื่อผู้ใช้, วันที่, และ [:ChangeSetID:รหัสประจำเซ็ตการแก้ไข]อาจต่างไปในเครื่องของคุณ

จากที่เราได้เรียนในบท [:ThaiTutorialClone:ทำสำเนา repository ที่มีอยู่] เราจะเห็นว่าเซ็ตการแก้ไขใหม่นี้จะอยู่แค่ใน repository นี้เท่านั้น จุดนี้เป็นจุดที่สำคัญมากในการทำความเข้าใจการทำงานของ Mercurial

อ่านบทต่อไปได้เลยเพื่อ [:ThaiTutorialShareChange:แบ่งปันสิ่งที่เราแก้ไขกับ repository อื่น]


CategoryTutorial

ThaiTutorialFirstChange (last edited 2009-05-19 19:31:05 by localhost)