บทเรียน - ดูประวัติการแก้ไขใน repository
(หน้านี้เป็นหน้าที่ 2 จาก 9 ของ[:Tutorial:บทเรียน]การใช้งาน Mercurial หน้าก่อนหน้าคือ [:ThaiTutorialClone], หน้าถัดไปคือ [:ThaiTutorialFirstChange])
หลังจากที่เราได้ทำตามขั้นตอนใน ThaiTutorialClone เราก็จะมีสำเนาส่วนตัวของ repository ในเครื่องตัวเองชื่อ my-hello
ลองมาดูกันว่า [:Repository:repository] นี้มีประวัติการแก้ไขอะไรบ้าง เราสามารถดูประวัติได้โดยใช้คำสั่ง log ซึ่งจะพิมพ์สรุปการแก้ไขทุกๆอันที่เกิดขึ้นใน repository โดยเริ่มแสดงจากการแก้ไขล่าสุดไปจนถึงการแก้ไขแรก
$ cd my-hello $ hg log changeset: 1:82e55d328c8c tag: tip user: mpm@selenic.com date: Fri Aug 26 01:21:28 2005 -0700 summary: Create a makefile changeset: 0:0a04b987be5a user: mpm@selenic.com date: Fri Aug 26 01:20:50 2005 -0700 summary: Create a standard "hello, world" program
เราลองมาทำความเข้าใจแต่ละบรรทัดของผลลัพธ์กัน
ย่อหน้าแต่ละย่อหน้าอธิบายเกี่ยวกับ [:ChangeSet:changeset] หนึ่ง โดย changeset คือการแก้ไขไฟล์ต่างๆที่ถูกจัดกลุ่มเป็นกลุ่มเดียวกัน
- ในตัวอย่างด้านบน เราจะเห็นได้ว่าประวัติของ repository ประกอบไปด้วยสอง changesets
changeset ระบุเลขที่ changeset
ตัวเลขแรกก่อนเครื่องหมาย : คือ[:RevisionNumber:ตัวเลข revision]; เป็นตัวเลขสั้นๆที่ใช้ระบุ changeset ใดๆ ตัวเลขนี้มีความหมายเฉพาะสำหรับ repository นี้เท่านั้น
ตัวเลขที่เป็นเลขฐาน 16 หลังเครื่องหมาย : เป็นรูปแบบสั้น (short-form) ของ [:ChangeSetID:changeset ID]; ตัวเลขนี้เป็นตัวแทนของ changeset นี้ในทุกๆ repository ที่มี changeset นี้ ถ้าคุณต้องพูดถึง changeset ใดกับคนอื่นๆ ให้ใช้เลข changeset ID แทนที่จะใช้ตัวเลข revision
tag คือ[:Tag:ป้ายกำกับ] ซึ่งเป็นชื่อที่มีความหมายสำหรับ changeset
คุณสามารถสร้างป้ายกำกับได้มากกว่าหนึ่งป้ายสำหรับ changeset ใดๆ จริงๆแล้วคงมีไม่กี่ changeset ที่มีป้ายกำกับติดตัว เพราะฉะนั้นคุณคงไม่ค่อยเห็นบรรทัด tag บ่อยนัก
ป้ายกำกับพิเศษที่ชื่อ tip เป็นป้ายที่ระบุ[:Tip:ปลาย]ของ repository ซึ่งก็คือ changeset ล่าสุดใน repository เสมอ ถ้าคุณสร้าง changeset ใหม่ (ซึ่งเรากำลังจะทำในอีกแป๊ปเดียว) ป้ายกำกับ tip จะถูกลบออกจาก changeset ล่าสุดและไปเพิ่มที่ changeset ใหม่ที่เราเพิ่งสร้างแทน
user บอกว่าใครเป็นคนสร้าง changeset ค่านี้ไม่มีรูปแบบตายตัว แต่โดยปกติจะเป็นอีเมล์ และบางครั้งก็มีชื่อผู้สร้างด้วย
date บอกว่า changeset นี้ถูกสร้างเมื่อไร Mercurial จะพิมพ์วันที่โดยใช้เขตเวลาที่ผู้สร้าง changeset อยู่
summary เป็นบรรทัดแรกของคำอธิบาย changeset คำอธิบายนี้จะถูกใส่โดยผู้สร้าง changeset เวลาที่พวกเค้าสร้าง เพื่อบอกคนอื่นๆว่าเค้าได้แก้ไขอะไรไปบ้าง และแก้ไขเพราะอะไร (ลองดู ["ChangeSetComments"])
parent บอกว่า changeset ไหนเป็น [:Parent:บรรพบุรุษ] ของ changeset นี้ ถ้ามีบรรพบุรุษมากกว่าหนึ่งนั่นก็หมายความว่า changeset นี้ถูก[:Merge:รวม] จากการแก้ไขในหลายๆ repository
- โดยปกติแล้ว changeset จะมีบรรพบุรุษแค่อันเดียวนั้นก็คือ changeset ก่อนหน้า อย่างที่เห็นได้ในตัวอย่างด้านบน
เราสามารถดูรายละเอียดเพิ่มเติมได้โดยขอให้ Mercurial พิมพ์ผลลัพธ์มากหน่อยผ่านตัวเลือก -v หรือจะใช้ตัวเลือก --debug ที่มีผลในระดับ global กับทุกๆคำสั่งก็ได้:
$ hg log -v changeset: 1:82e55d328c8c tag: tip user: mpm@selenic.com date: Fri Aug 26 01:21:28 2005 -0700 files: Makefile description: Create a makefile (...) $ hg log --debug changeset: 1:82e55d328c8ca4ee16520036c0aaace03a5beb65 tag: tip parent: 0:0a04b987be5ae354b710cefeba0e2d9de7ad41a9 parent: -1:0000000000000000000000000000000000000000 manifest: 1:0c7c1d435e6703e03ac6634a7c32da3a082d1600 user: mpm@selenic.com date: Fri Aug 26 01:21:28 2005 -0700 files+: Makefile extra: branch=default description: Create a makefile (...)
ผลลัพธ์แบบละเอียดนี้มีฟิลด์เพิ่มขึ้นมาอีกสองสามอัน
files บอกว่าไฟล์ไหนถูกแก้ไขบ้างใน changeset นี้
description แสดงคำอธิบายทั้งหมด (ไม่ใช่แค่บรรทัดแรก)
- ในตัวอย่างด้านบน เนื่องจากว่าคำอธิบายยาวแค่บรรทัดเดียว เพราะฉะนั้นเราจะไม่เห็นความแตกต่างเวลาใช้ตัวเลือกนี้
ผลลัพธ์จากตัวเลือก --debug เพิ่มฟิลด์เหล่านี้ (ลองดู [:DebuggingFeatures]):
changeset จะแสดง changeset ID แบบเต็ม
ฟิลด์ parent สองอันที่ระบุ changeset ID ของบรรพบุรุษทั้งสองของ changeset นี้ โดยที่ ID -1:0000000000000000000000000000000000000000 แทนค่ากรณีที่ไม่มีบรรพบุรุษ
manifest แสดง [:Manifest:manifest] ID สำหรับ changeset นี้
file+ แสดงไฟล์ที่ถูกเพิ่มใหม่ใน changeset นี้
file- แสดงไฟล์ที่ถูกลบออกใน changeset นี้
คำสั่ง log มาพร้อมกับตัวเลือก -r เพื่อดูรายละเอียดสำหรับ changeset โดยเจาะจง
$ hg log -r1 changeset: 1:82e55d328c8c tag: tip user: mpm@selenic.com date: Fri Aug 26 01:21:28 2005 -0700 summary: Create a makefile
ตัวเลือก -r สนับสนุน syntax มากมายในการเลือกช่วงของ changesets แต่เนื่องจากเรามีจำนวน changeset ในตัวอย่างค่อนข้างจำกัด เราจึงไม่สามารถแสดงวิธีการใช้ตัวเลือกต่างๆได้ ลองอ่าน [http://www.selenic.com/mercurial/hg.1.html#log manpage] เพิ่มเติมดู
นอกจากนั้นก็ยังมีตัวเลือก -p ที่มาพร้อมกับคำสั่ง log เพื่อแสดง patch ต่างที่เกี่ยวข้องกับ changeset:
$ hg log -r1 -p changeset: 1:82e55d328c8c tag: tip user: mpm@selenic.com date: Fri Aug 26 01:21:28 2005 -0700 summary: Create a makefile diff -r 0a04b987be5a -r 82e55d328c8c Makefile --- /dev/null Fri Aug 26 01:20:50 2005 -0700 +++ b/Makefile Fri Aug 26 01:21:28 2005 -0700 @@ -0,0 +1,1 @@ +all: hello
เรายังสามารถใช้คำสั่ง tip เพื่อแสดงรายละเอียดของส่วนปลายหรือ changeset ล่าสุดของ ของ repository คิดซะว่าคำสั่ง tip เป็นทางลัดสำหรับคำสั่ง log -r tip
$ hg tip changeset: 1:82e55d328c8c tag: tip user: mpm@selenic.com date: Fri Aug 26 01:21:28 2005 -0700 summary: Create a makefile $ hg log -r tip changeset: 1:82e55d328c8c tag: tip user: mpm@selenic.com date: Fri Aug 26 01:21:28 2005 -0700 summary: Create a makefile
ถึงตรงนี้เราพอจะมีไอเดียบ้างแล้วว่าเกิดอะไรขึ้นใน repository ถึงเวลาที่จะแก้ไขไฟล์แล้ว! ลุยต่อที่ [:ThaiTutorialFirstChange]!