บทเรียน - ดูประวัติการแก้ไขใน repository
(บทนี้เป็นบทที่ 3 จาก 9 บทของ บทเรียนการใช้งาน Mercurial บทก่อนหน้าคือ ทำสำเนา repository ที่มีอยู่, บทถัดไปคือ ทำการแก้ไขแรกของคุณ)
หลังจากที่เราได้ทำตามขั้นตอนในบท ทำสำเนา repository ที่มีอยู่ เราก็จะมีสำเนาของ repository ในเครื่องตัวเองชื่อ my-hello
ลองมาดูกันว่า 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
เราลองมาทำความเข้าใจความหมายของแต่ละบรรทัดกัน
ย่อหน้าแต่ละย่อหน้าในผลลัพธ์อธิบายเกี่ยวกับเซ็ตการแก้ไขแต่ละเซ็ต เซ็ตการแก้ไขก็คือการจัดกลุ่มไฟล์ต่างๆที่ถูกแก้ไขให้เป็นกลุ่มเดียวเวลาคอมมิท
- ในตัวอย่างด้านบน repository มีประวัติการแก้ไขสองครั้ง (สองเซ็ตการแก้ไข)
changeset เป็นเลขที่หรือรหัสที่ใช้เพื่อระบุเซ็ตการแก้ไขนั้นๆ
ตัวเลขตัวแรกก่อนเครื่องหมาย : คือครั้งที่แก้ไข เป็นตัวเลขสั้นๆที่ใช้ระบุเซ็ตการแก้ไขใดๆ ตัวเลขนี้จะมีความหมายเฉพาะสำหรับ repository นี้เท่านั้น
ตัวเลขฐาน 16 หลังเครื่องหมาย : เป็นรูปแบบย่อ (short-form) ของรหัสประจำเซ็ตการแก้ไข; ตัวเลขนี้ใช้เพื่อระบุเซ็ตการแก้ไขนี้ใน repository ใดก็ตามที่มีเซ็ตการแก้ไขนี้อยู่ ถ้าคุณต้องพูดถึงเซ็ตการแก้ไขกับคนอื่นๆให้ใช้รหัสประจำเซ็ตการแก้ไขแทนที่จะใช้ตัวเลขครั้งที่แก้ไข
tag คือป้ายกำกับซึ่งเป็นชื่อที่มีความหมายของเซ็ตการแก้ไข
เราสามารถสร้างป้ายกำกับได้มากกว่าหนึ่งป้ายสำหรับเซ็ตการแก้ไข จริงๆแล้วคงมีไม่กี่เซ็ตที่มีป้ายกำกับติดตัวเพราะฉะนั้นคุณคงไม่ค่อยเห็นบรรทัด tag นี้บ่อยนัก
ป้ายกำกับพิเศษที่ชื่อ tip เป็นป้ายที่ระบุส่วนปลายของ repository (ที่เป็นเซ็ตการแก้ไขล่าสุดใน repository เสมอ) ถ้าคุณสร้างเซ็ตการแก้ไขใหม่ (ซึ่งเรากำลังจะทำในอีกแป๊ปเดียว) ป้ายกำกับ tip จะถูกลบออกจากเซ็ตการแก้ไขล่าสุดและถูกเพิ่มที่เซ็ตการแก้ไขใหม่ที่เราเพิ่งสร้างแทน
user บอกว่าใครเป็นคนสร้างเซ็ตการแก้ไขนี้ ค่านี้ไม่มีรูปแบบตายตัว แต่โดยปกติจะเป็นอีเมล์และบางครั้งก็มีชื่อผู้สร้างด้วย
date บอกว่าเซ็ตการแก้ไขนี้ถูกสร้างเมื่อไร Mercurial จะพิมพ์วันที่โดยใช้เขตเวลาที่ผู้สร้างเซ็ตการแก้ไขอยู่
summary เป็นบรรทัดแรกของคำอธิบายของเซ็ตการแก้ไข คำอธิบายนี้จะถูกใส่โดยผู้สร้างเซ็ตการแก้ไขตอนคอมมิทเพื่อบอกคนอื่นว่าเค้าได้แก้ไขอะไรไปบ้าง และแก้ไขเพราะอะไร (ลองดู ChangeSetComments)
parent บอกว่าเซ็ตการแก้ไขไหนเป็นบรรพบุรุษของเซ็ตการแก้ไขนี้ ถ้ามีบรรพบุรุษมากกว่าหนึ่งนั่นก็หมายความว่าเซ็ตการแก้ไขนี้ถูกรวมจากส่วนยอดของ repository มากกว่าหนึ่งอัน
- โดยปกติแล้วเซ็ตการแก้ไขจะมีบรรพบุรุษแค่อันเดียวนั้นก็คือเซ็ตการแก้ไขก่อนหน้า อย่างที่เห็นได้ในตัวอย่างด้านบน
เราสามารถดูรายละเอียดเพิ่มเติมได้โดยขอให้ 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 (...)
ผลลัพธ์จากตัวเลือก -v มีฟิลด์เพิ่มขึ้นมาอีกสองสามอัน
files บอกว่าไฟล์ไหนถูกแก้ไขบ้างในเซ็ตการแก้ไขนี้
description แสดงคำอธิบายทั้งหมด (ไม่ใช่แค่บรรทัดแรก)
- ในตัวอย่างด้านบน เนื่องจากว่าคำอธิบายยาวแค่บรรทัดเดียวเราจะไม่เห็นความแตกต่างเวลาใช้ตัวเลือกนี้
ผลลัพธ์จากตัวเลือก --debug จะแสดงฟิลด์เหล่านี้เพิ่ม (ลองดู DebuggingFeatures):
changeset จะแสดงรหัสประจำเซ็ตการแก้ไขแบบเต็ม
ฟิลด์ parent สองอันสำหรับระบุรหัสประจำเซ็ตการแก้ไขของบรรพบุรุษทั้งสองของเซ็ตการแก้ไขนี้ รหัส -1:0000000000000000000000000000000000000000 จะแทนค่ากรณีที่ไม่มีบรรพบุรุษ
manifest แสดงรหัส manifest สำหรับเซ็ตการแก้ไขนี้
file+ แสดงไฟล์ที่ถูกเพิ่มใหม่ในเซ็ตการแก้ไขนี้
file- แสดงไฟล์ที่ถูกลบออกในเซ็ตการแก้ไขนี้
คำสั่ง log มาพร้อมกับตัวเลือก -r สำหรับดูรายละเอียดของเซ็ตการแก้ไขโดยเจาะจง
$ 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 มากมายสำหรับเลือกช่วงของเซ็ตการแก้ไขที่เราต้องการดู แต่เนื่องจากเรามีการแก้ไขแค่ 2 ครั้งในตัวอย่างเราจึงไม่สามารถแสดงวิธีการใช้ตัวเลือกต่างๆได้มากนัก ลองอ่าน manpage เพิ่มเติมดู
นอกจากนั้นก็ยังมีตัวเลือก -p ที่มาพร้อมกับคำสั่ง log สำหรับแสดง patch ของเซ็ตการแก้ไข:
$ 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 เพื่อแสดงรายละเอียดของส่วนปลายของ 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 มีความเป็นมายังไง ถึงเวลาที่จะทำการแก้ไขแรกแล้ว!