⇤ ← Revision 1 as of 2008-11-19 12:55:17
13961
Comment: Translate TutorialFirstChange to Thai
|
13965
Changed tutorial index link to Thai index
|
Deletions are marked like this. | Additions are marked like this. |
Line 3: | Line 3: |
''(หน้านี้เป็นหน้าที่ 4 จาก 9 ของ[:Tutorial:บทเรียน]การใช้งาน Mercurial หน้าก่อนหน้าคือ [:ThaiTutorialHistory], หน้าถัดไปคือ [:ThaiTutorialShareChange])'' | ''(หน้านี้เป็นหน้าที่ 4 จาก 9 ของ[:ThaiTutorial:บทเรียน]การใช้งาน Mercurial หน้าก่อนหน้าคือ [:ThaiTutorialHistory], หน้าถัดไปคือ [:ThaiTutorialShareChange])'' |
บทเรียน - ทำการแก้ไขแรก
(หน้านี้เป็นหน้าที่ 4 จาก 9 ของ[:ThaiTutorial:บทเรียน]การใช้งาน Mercurial หน้าก่อนหน้าคือ [:ThaiTutorialHistory], หน้าถัดไปคือ [:ThaiTutorialShareChange])
ต่อจาก ThaiTutorialHistory ตอนนี้เราอยู่ใน my-hello repository ที่เราทำสำเนามาตอน ThaiTutorialClone.
วิธีการใช้ 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:ไดเร็คทอรี่ทำงาน] (working directory) ของ repository ซึ่งเป็นชื่อเรียกสั้นๆสำหรับไดเร็คทอรี่ที่มีไฟล์อยู่นั่นแหละ จากนั้นก็แก้ไขซอร์สโค้ดด้วย text editor ตัวโปรดของคุณ:
$ 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;
}
หลังจากแก้ไขเสร็จก็ออกจาก editor ของเราก็เรียบร้อย เราพร้อมที่จะสร้าง [:ChangeSet:changeset] ใหม่แล้ว
แต่จะเกิดอะไรขึ้นถ้าเกิดมีคนมาขัดจังหวะแล้วเราดันลืมไปว่าอะไรบ้างที่ถูกแก้ไขที่จะอยู่ใน changeset ล่ะ? คำตอบอยู่ในคำสั่ง status
$ hg status M hello.c
ผลลัพธ์จากคำสั่งนั้นสั้นๆ ตัวอักษร M บอกเราว่าไฟล์ hello.c ได้ถูกแก้ไข (modified) และการแก้ไขนี้ก็พร้อมที่จะเข้าไปอยู่ใน changeset แล้ว
ถ้าคุณขี้เกียจพิมพ์คำสั่งยาวๆแบบ 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
การสร้าง changeset มีชื่อเรียกอีกชื่อนึงว่าการ [:Commit:คอมมิท] changeset เราทำการคอมมิทโดยใช้คำสั่ง 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 จะเป็นบรรทัดว่างๆ ไว้ให้เราใส่คำอธิบายของ changeset นี้ ส่วนบรรทัดต่อๆไปก็จะบอกชื่อผู้ใช้ ชื่อ branch และไฟล์ต่างๆที่อยู่ใน changeset นี้
ปกติชื่อของ 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])
เพื่อที่จะคอมมิท changeset เราจะต้องใส่คำอธิบาย (ดู [: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
ไม่มีอะไรเลย! สิ่งที่เราแก้ไขได้ถูกคอมมิทเป็น changeset แล้วเพราะฉะนั้นจึงไม่มีไฟล์ใดๆที่ถูกแก้และยังไม่ได้ถูกคอมมิท และ[:Tip:ปลาย] repository ของเราก็ตรงกับไดเร็คทอรี่ทำงานด้วย
นอกจากนั้นคำสั่ง [:Parent:parents] บอกกับเราว่าไดเร็คทอรี่ทำงานของ repository เราตรงกับ changeset ที่ถูกคอมมิทล่าสุดแล้ว (ดู [: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
เท่านี้ล่ะ! เราได้คอมมิท changeset ใหม่เข้าไปใน 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:changeset ID] อาจต่างกันไปได้จากที่คุณทดลอง
จากที่เราได้เรียนใน [:ThaiTutorialClone] changeset ใหม่นี้จะอยู่แค่ใน repository นี้เท่านั้น ข้อเท็จจริงนี้นี้เป็นส่วนสำคัญมากในการเข้าใจการทำงานของ Mercurial
ถ้าเราต้องการแบ่งปันการแก้ไขนี้ เราจะต้องอ่านต่อที่ ThaiTutorialShareChange