418342 ภาคปลาย 2552/ปฏิบัติการที่ 1

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา

Mercurial

ในเทอมนี้เราจะใช้ Mercurial ซึ่งเป็นซอฟต์แวร์สำหรับจัดการซอร์สโค้ดตัวหนึ่ง ในการให้การบ้าน การส่งการบ้าน รวมไปถึงการทำแล็บ

คุณสามารถดาวน์โหลด Mercurial ได้จาก [1] และถ้าคุณใช้ระบบปฏิบัติการ Windows เราแนะนำให้คุณลง TortoiseHg ด้วย เพราะมันช่วยทำให้คุณใช้ Mercurial ได้สะดวกขึ้นมาก

เราได้สร้าง repository (ที่เก็บไฟล์)​ ส่วนตัวให้กับนิสิตทุกคนที่ลงทะเบียนแล้ว ซึ่งมันอยู่ที่ https://theory.cpe.ku.ac.th/418342_<<ชื่อ account เกษตร ของคุณ>> ส่วนรหัสผ่านเราจะแจกให้คุณในชั้นเรียน

เมื่อคุณเข้าไปแล้วจะพบว่าในนั้นไม่มีไฟล์อะไรอยู่เลย

การทำงานกับระบบจัดการซอร์สโค้ด

การทำงานโดยใช้ระบบจัดการซอร์สโค้ดมีขั้นตอนดังต่อไปนี้

คุณทำการ clone repository ที่เก็บอยู่บนเครื่องเซิร์ฟเวอร์ (ในที่นี้คือเครื่อง theory.cpe.ku.ac.th) ลงเครื่องส่วนตัวของคุณ
while true do
   pull ความเปลี่ยนแปลงที่อยู่บน server มา
   update ซอร์สโค้ดที่เก็บไว้บนเครื่อง
   แก้ไขซอร์สโค้ดบนเครื่องส่วนตัว
   commit ความเปลี่ยนแปลงที่คุณสร้าง
   push ความเปลี่ยนแปลงที่อยู่บนเครื่องส่วนตัวเข้าเครื่องเซิร์ฟเวอร์

คุณจะเห็นได้ว่ามีขั้นตอนที่มีชื่อเป็นภาษาอังกฤษสามขั้นตอนคือ clone, pull, update, commit, และ push ขั้นตอนสามขั้นตอนนี้เป็นคำสั่งของ mercurial ที่คุณสามารถใช้ได้โดยตรง และเราจะมาเรียนรู้มันกันในวันนี้

การ clone

การ clone คือการคัดลอก repository ทั้ง repository มาเก็บไว้บนเครื่องของคุณ สิ่งที่คุณได้มากับ repository คือประวัติศาสตร์ความเปลี่ยนแปลงทั้งหมดที่คุณเคยสร้างกับโค้ดที่อยู่ใน repository นั้น ฉะนั้นเมื่อคุณมี repository แล้วคุณสามารถจะย้อนไปดูโค้ดเวอร์ชันไหนก็ได้ตั้งแต่เริ่มต้นทำงาน คล้ายกับที่คุณสามารถดู history ของหน้าวิกินี้ได้

การโคลนเราจะใช้การสั่ง hg clone โดยให้คุณเข้าไปใน command prompt ของระบบปฏิบัติการคุณ แล้วสั่ง

hg clone https://theory.cpe.ku.ac.th/418342_<<ชื่อ account>> <<ชื่อไดเรคทอรีที่คุณต้องการให้เป็นที่อยู่ของ repository>>

เช่น ถ้าผมต้องการให้ repository ของผมอยู่ที่ไดเรคทอรี c:\418342 ผมอาจจะสั่งคำสั่งต่อไปนี้

cd c:\
hg clone https://theory.cpe.ku.ac.th/418342_pramook 418342

สำหรับคนที่ใช้ TortoiseHg คุณสามารถคลิกขวาในหน้าต่าง Explorer ของไดเรคทอรีที่คุณต้องการ "Clone a Repository Here..."

คำถาม 1

ในไดเรคทอรีที่คุณเพิ่งจะโคลนมามีไฟล์อะไรบ้าง? (รวมไฟล์ที่ถูกซ่อน (hidden) ด้วย)

การ pull

เวลาโปรแกรมเมอร์หลายคนทำงานพร้อมๆ กัน จะมีการตั้ง server กลางไว้หนึ่งเครื่องเพื่อเก็บโค้ดที่เสถียรและได้รับการทดสอบมาอย่างดีแล้ว หลังจากนั้นโปรแกรมเมอร์แต่ละคนก็จะ clone repository มาไว้บนเครื่องของตัวเอง แล้วทำงานไปเรื่อยๆ บางคนทำงานเสร็จแล้วก็จะส่งโค้ดที่ตนเองแก้ไขหรือเพิ่มเข้า repository ไป เมื่อโปรแกรมเมอร์คนอื่นต้องการจะได้ความเปลี่ยนแปลงที่โปรแกรมคนอื่นสร้างและส่งเข้าสู่ server แล้ว เขาจะทำการ "pull" มันออกมาจาก server

สำหรับการเรียนการสอนวิชานี้ การตั้ง server ของเราจะไม่เหมือนกับที่กล่าวในย่อหน้าที่แล้ว ผมได้ตั้ง "master repository" ที่จะบรรจุโค้ดแล็ปและการบ้านไว้ ถ้าคุณต้องการโค้ดของแล็ปหรือการบ้าน คุณจะต้องไป pull มันจาก master repository มายัง repository บนเครื่องคอมพิวเตอร์ส่วนตัวของคุณ

​master repository ของเราอยู่ที่ https://theory.cpe.ku.ac.th/418342_master/ เมื่อคุณเข้าเวบไซต์ที่ URL นี้คุณสามารถเข้าไปดูว่าใน repository นี้ไฟล์อะไรอยู่บ้างด้วยการคลิกที่ลิงค๋ "manifest"

คำถาม 2

ใน master repository มีไฟล์อยู่กี่ไฟล์? อะไรบ้าง?

เมื่อคุณพร้อมที่จะดึงไฟล์จาก master repository เข้า repository บนเครื่องส่วนตัวของคุณแล้ว

ในการณ์นี้ให้คุณเข้าไปในไดเรคทอรีที่ของ repository แล้วสั่ง

hg pull https://theory.cpe.ku.ac.th/418342_master

การ Update

เมื่อคุณเข้าไปดูในไดเรคทอรีของ repository บนเครื่องคอมพิวเตอร์ส่วนตัวของคุณ คุณจะพบว่ายังไม่มีความเปลี่ยนแปลงอะไรเกิดขึ้นเลย

นี่เป็นเพราะว่าสิ่งที่ Mercurial ทำเวลาคุณสั่ง pull คือการไปดึงเอา "เซตของความเปลี่ยนแปลง" (changeset) ที่ server มายังเครื่องของคุณ แต่มันยังไม่ได้ทำให้เซตของความเปลี่ยนแปลงนี้มีผลกับเนื้อหาของไฟล์ที่คุณกำลังแก้ไข

หากคุณต้องการทำให้ changeset ที่ดึงมามีผลต่อไฟล์ที่คุณกำลังแก้ไข ให้สั่ง

hg update

แก้ไขไฟล์

ให้ทดลองเปลี่ยนแปลงไฟล์ lab-01/hello.rb และสร้างไฟล์ lab-01/hello2.rb แล้วก็อปปี้เนื้อหาของ lab-01/hello.rb ไปใส่

คำถาม 3

คุณสามารถดูสถานะของไฟล์ต่างๆ ในไดเรคทอรีได้ด้วยการสั่ง

hg status

หลังจากลองสั่งคำสั่งนี้แล้วคุณเห็นอะไรบ้าง?


หลังจากคุณแก้ไขและสร้างไฟล์ใหม่นี้เสร็จแล้ว Mercurial ยังไม่รู้ว่ามีไฟล์ lab-01/hello2.rb นี้อยู่เลย ถ้าคุณอยากจะให้ Mercurial จัดการไฟล์นี้ให้ด้วย ให้สั่ง

hg add lab-01/hello2.rb

เพื่อบอกให้ Mercurial เพิ่มไฟล์ lab-01/hello2.rb เข้าในบัญชีของไฟล์ที่มันจัดการให้ ในกรณีที่คุณสร้างไฟล์ใหม่จำนวนหลายๆ ไฟล์ คุณสามารถสั่ง

hg add

เฉยๆ แล้ว Mercurial จะเพิ่มไฟล์ใหม่ทุกไฟล์ที่ยังไม่อยู่ในบัญชีให้โดยอัตโนมัติ

คำถาม 4

สั่ง hg status อีกครั้ง หลังจากลองสั่งคำสั่งนี้แล้วคุณเห็นอะไรบ้าง?

การ commit

แต่หลังจาก add ไฟล์ใหม่ไปแล้ว Mercurial ก็ยังไม่รู้ว่าเนื้อหาของไฟล์มีการเปลี่ยนแปลงแต่อย่างใด มันรู้เฉยๆ ว่ามีไฟล์ใหม่เท่านั้น หากเราต้องการให้ Mercurial รับทราบถึงการเปลี่ยนแปลงของเนื้อหาของไฟล์ต่างๆ เราต้องสั่ง

hg commit

เมื่อสั่งเช่นนี้แล้วคุณจะพบว่ามีหน้าต่าง text editor โผล่ขึ้นมาพร้อมกับข้อความทำนองนี้

HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: pramook
HG: branch 'default'
HG: added lab-01/hello2.rb
HG: changed lab-01/hello.rb

Mercurial บอกให้คุณใส่ "commit message" ซึ่งเป็นข้อความสั้นๆ ที่บอกว่าเราได้ทำอะไรไปก่อนที่จะทำการ commit ครั้งนี้ ในกรณนี้ให้คุณใส่ข้อความทำนองที่ว่าคุณเพิ่มไฟล์ lab-01/hello2.rb ไป แล้วกดเซฟ แล้วปิด text editor ของคุณ หลังจากทำเช่นนี้แล้วจะถือว่าการ commit สำเร็จ

คำถาม 5

ลองสั่ง hg status อีกครั้ง คุณเห็นอะไรบ้าง?

ถ้าคุณเห็นผลลัพธ์เป็นเหมือนกับผลลัพธ์ในคำถามที่ 4 แสดงว่าคุณทำการ commit ไม่สำเร็จ ฉะนั้นจงทำตามขั้นตอนข้างบนใหม่อีกครั้ง

การ push

การ commit เป็นการสร้าง changeset ซึ่งระบุความเปลี่ยนแปลงที่คุณได้ทำขึ้นตั้งแต่การ clone repository หรือการ commit ครั้งก่อนหน้านั้น เจ้า changeset ที่สร้างขึ้นนี้จะอาศัยอยู่ใน repository บนเครื่องคอมพิวเตอร์ส่วนตัวของคุณ แต่เวลาที่คุณจะส่งแล็ปหรือส่งการบ้าน คุณจะต้องส่ง changeset ที่คุณสร้างไปยัง server กลาง การส่ง changeset นี้เรียกว่าการ "push" ซึ่งคุณสามารถ push ได้ด้วยการสั่ง

hg push

ซึ่งจะทำให้ changeset ที่คุณสร้างขึ้นจากการ commit เมื่อตะกี้ถูกสั่งไปยัง repository ต้นฉบับที่คุณ clone repository บนคอมพิวเตอร์ส่วนตัวของคุณมา (นั่นคือ repository ที่ https://theory.cpe.ku.ac.th/418342_<<ชื่อ account ของคุณ>>)

อิสรภาพจากเครื่องคอมพิวเตอร์

เมื่อคุณ push โค้ดที่คุณเขียนไปยัง server กลางทั้งหมดแล้ว คุณสามารถที่จะย้ายไปทำงานที่เครื่องคอมพิวเตอร์เครื่องอื่นที่มี Mercurial ลงได้

ขอให้คุณเปลี่ยนเครื่องคอมพิวเตอร์ที่คุณใช้ไปเครื่องที่อยู่ข้างๆ เมื่อไปถึงแล้วให้สั่ง

hg clone https://theory.cpe.ku.ac.th/418342_<<ชื่อ account>> <<ชื่อไดเรคทอรีที่คุณต้องการให้เป็นที่อยู่ของ repository>>

แล้วตรวจสอบดูว่ามีไฟล์ lab-01/hello2.rb หรือไม่ และไฟล์ lab-02/hello.rb เป็นไปตามที่คุณเคยแก้ไขมันไว้หรือไม่ด้วย