Differences between revisions 2 and 3
Revision 2 as of 2008-11-21 03:12:32
Size: 12440
Comment: Translate Committing Changes section to Thai
Revision 3 as of 2008-11-21 05:55:34
Size: 18400
Comment: Translate remaining text to Thai
Deletions are marked like this. Additions are marked like this.
Line 85: Line 85:
== Revisions, Changesets, Heads, and Tip ==

Mercurial groups related changes to multiple files into single atomic [:ChangeSet:changesets], which are revisions of the whole project.
These each get a sequential [:RevisionNumber:revision number]. Because Mercurial allows distributed parallel development, these revision numbers may disagree between users. So Mercurial also assigns each revision a global [:ChangeSetID:changeset ID]. Changeset IDs are 40-digit hexadecimal numbers, but they can be abbreviated to any unambiguous prefix, like "e38487".
== Revisions, Changesets, Heads, และ Tip ==

Mercurial รวมการแก้ไขในหลายๆไฟล์ไว้ด้วยกันเป็นกลุ่มเพื่อที่จะคอมมิทเป็น [:ChangeSet:changeset] หรือเรียกอีกชื่อนึงได้ว่า revision ของโปรเจค
แต่ละ revision ก็จะมีตัวเลขเป็นตัวแทนเรียกว่า [:RevisionNumber:revision number] ซึ่งจะเพิ่มขึ้นตามลำดับ และเนื่องจากว่า Mercurial อนุญาติให้ผู้ใช้หลายๆคนทำงานขนานกันในหลายๆ repository ตัวเลข revision number ของผู้ใช้แต่ละคนอาจไม่ตรงกัน Mercurial จึงให้ตัวเลขอีกตัวเลขนึงเป็นตัวแทนของแต่ละ changset ในทุกๆ repository ตัวเลขนี้เป็นตัวเลขฐานสิบหกยาว 40 หลักเรียกว่า [:ChangeSetID:changeset ID] และสามารถถูกย่อได้ตราบใดที่บ่งบอกถึง changeset ที่ไม่กำกวมเช่น "e38487"
Line 114: Line 114:
Branches and [:Merge:merges] in the revision history can occur at any point. Each unmerged branch creates a new [:Head:head] of the revision history.
Here, revisions 5 and 6 are heads. Mercurial considers revision 6 to be the [:Tip:tip] of the repository, the head with the highest revision number.
Revision 4 is a [:MergeChangeset:merge changeset], as it has ''two'' parent changesets (revisions 2 and 3).

== Cloning, Making Changes, Merging, Pulling and Updating ==

Let's start with a user Alice, who has a repository that looks like:
การ branch และ[:Merge:รวมการแก้ไข]สามารถเกิดขึ้นตรงจุดใดก็ได้ในประวัติการแก้ไข แต่ละ branch ที่ยังไม่ได้ถูกรวมจะสร้างสิ่งที่เรียกว่า [:Head:head] ใหม่ในประวัติการแก้ไข
ในรูปภาพด้านบน revisions 5 และ 6 คือ head แต่ Mercurial ให้ความหมายของ revision 6 ว่าเป็น[:Tip:ปลาย]ของ repository ด้วยเพราะว่าเป็น head ที่มีตัวเลข revision number สูงที่สุด
Revision 4 เรียกว่า [:MergeChangeset:merge changeset] เพราะว่าเป็น changeset ที่เกิดจากการรวมของ changeset ''สอง'' อันทีเป็นบรรพบุรุษ (คือ revisions 2 และ 3)

== การทำสำเนา, แก้ไข, รวมการแก้ไข, ดึงการแก้ไข และอัพเดท ==

สมมุติว่าเรามีผู้ใช้คนนึงชื่ออลิซ ซึ่งมี repository แบบนี้:
Line 131: Line 131:
Bob [:Clone:clones] this repo, and ends up with a complete, independent, local copy of Alice's store
and a clean checkout of the tipmost revision d in his working directory:
บ๊อบ[:Clone:ทำสำเนา] repository ของอลิซเป็น repository ส่วนตัวของตัวเองที่เป็นเอกเทศจากตัวต้นแบบของอลิซ และก็มีไฟล์ของเวอร์ชั่นปลายซึ่งก็คือ revision d ในไดเร็คทอรี่ทำงานของเขา:
Line 143: Line 142:
Bob can now work independently of Alice. He then [:Commit:commits] two changes e and f: ตอนนี้บ๊อบสามารถทำงานได้เป็นอิสระจากอลิซ บ๊อบทำการแก้ไขและ[:Commit:คอมมิท]การแก้ไขสองครั้งคือ e และ f:
Line 156: Line 155:
Alice then makes her own change g in parallel, which causes her repository store to diverge from Bob's, thus
creating a [:Branch:branch]:
ในขณะเดียวกันอลิซก็ทำการแก้ไข g เช่นกัน ทำให้ประวัติการแก้ไขใน repository ของเธอแตกแขนงออกไปจากของบ๊อบและทำให้เกิด [:Branch:branch] ขึ้น:
Line 169: Line 167:
Bob then [:Pull:pulls] Alice's repo to synchronize. This copies all of Alice's changes into Bob's repository store
(here, it's just a single change g). Note that Bob's working directory is '''not''' changed
by the pull:
บ๊อบจึง[:Pull:ดึงการแก้ไข]จาก repository ของอลิซเพื่อทำให้ประวัติการแก้ไขตรงกัน การทำเช่นนี้จะคัดลอกการแก้ไขที่อลิซทำทั้งหมดมาไว้ใน repository ของบ๊อบ (ในตัวอย่างนี้คือแค่การแก้ไข g) สังเกตุว่าไดเร็คทอรี่ทำงานของบ๊อบจะ'''ไม่'''ถูกเปลี่ยนแปลงจากการดึงการแก้ไขครั้งนี้:
Line 186: Line 182:
Because Alice's '''g''' is the newest head in Bob's repository, it's now the '''tip'''.

Bob then does a [:Merge:merge], which combines the last change he was working on (f) with the
tip in his working directory. Now, his working directory has two parent revisions (f and g):
และเนื่องจากว่าการแก้ไข '''g''' ของอลิซกลายเป็น head ใหม่ใน repository ของบ๊อบมันเลยกลายเป็น '''ปลาย''' ของ repository ด้วย

จากนั้นบ๊อบก็ทำการ[:Merge:รวมการแก้ไข]ซึ่งก็คือการรวมการแก้ไขล่าสุดของเขา (f) กับปลายของ repository หลังจากการรวม ไดเร็คทอรี่ทำงานของเค้าก็จะมีบรรพบุรุษ 2 revisions คือ f และ g:
Line 206: Line 201:
After examining the result of the merge in his working directory and making sure the merge is
perfect, Bob commits the result and ends up with a new [:MergeChangeset:merge changeset] h in his
store:
หลังจากตรวจสอบดูว่าการรวมการแก้ไขในไดเร็คทอรี่ทำงานของเขาเป็นไปด้วยดีไม่มีอะไรผิดพลาด บ๊อบก็คอมมิทและสร้าง [:MergeChangeset:merge changeset] ใหม่คือ h ใน store ของ repository เขา:
Line 227: Line 220:
Now if Alice '''pulls''' from Bob, she will get Bob's changes e, f, and h into her store: ตอนนี้ถ้าอลิซ'''ดึงการแก้ไข'''จากบ๊อบ เธอจะเห็นประวัติการแก้ไขจากบ๊อบคือ e, f, และ h ใน store ของเธอด้วย:
Line 246: Line 239:
Note that Alice's working directory was not changed by the pull. She has to do an [:Update:update] to synchronize
her working directory to the merge changset h. This changes the parent changeset of her working directory to
changeset h and updates the files in her working directory to revision h.
สังเกตุว่าไดเร็คทอรี่ทำงานของอลิซไม่ถูกเปลี่ยนเนื่องจากการดึงการแก้ไข เธอจะต้องทำการ[:Update:อัพเดท]เพื่อทำให้ไดเร็คทอรี่ทำงานมีเนื้อหาตรงกับ changset h การอัพเดทจะทำให้บรรพบุรุษของไดเร็คทอรี่ทำงานเปลี่ยนเป็น changeset h และทำให้เนื้อหาของไฟล์ในไดเร็คทอรี่ทำงานตรงกับเนื้อหาของ revision h.
Line 267: Line 258:
Now Alice and Bob are fully synchronized again.


== A Decentralized System ==

Mercurial is a completely decentralized system, and thus has no internal notion of a central repository. Thus users are free to define their own topologies for sharing changes (see CommunicatingChanges):
ถึงตอนนี้ทั้งอลิซและบ๊อบมีทั้งประวัติการแก้ไขและเนื้อหาในไดเร็คทอรี่ทำงานตรงกันอีกครั้ง


== ระบบการทำงานแบบแยกศูนย์ ==

Mercurial เป็นระบบที่ทำงานแบบแยกศูนย์ จึงไม่มีการกำหนดความหมายพิเศษสำหรับ repository กลาง ผู้ใช้มีสิทธิ์เลือกโครงสร้างของ repository ต่างๆได้ตามต้องการ (ดู CommunicatingChanges):
Line 292: Line 283:
Unlike a centralized version control system in which experimentation
can be disastrous, with a DVCS like Mercurial, you just clone and
experiment. If you like the results, push them back, otherwise
wipe the cloned repository and try something else.


== What Mercurial can't do ==

Many SVN/CVS users expect to host related projects together in one repository. This is really not what hg was made for, so you should try a different way of working. This especially means, that you cannot check out only one directory of a repository. If you absolutely need to host multiple projects in a kind of meta-repository though, you could try the ForestExtension.



For a hands-on introduction to using Mercurial, see the ["Tutorial"].
ต่างจากระบบเวอร์ชั่นคอนโทรลแบบรวมศูนย์อื่นๆซึ่งการแก้ไขเพื่อทดลองอะไรๆ อาจก่อให้เกิดปัญหา ระบบ DVCS อย่าง Mercurial สามารถทำให้คุณทดลองได้อย่างง่ายดายโดยการทำสำเนาของ repository และก็เริ่มแก้ไขได้เลย ถ้าการแก้ไขเป็นไปได้ด้วยดี คุณก็แค่ push ไปที่ repository อื่น แต่ถ้าคุณไม่ชอบก็ลบ repository ทิ้งและลองวิธีอื่นแทน


== Mercurial ทำอะไรไม่ได้บ้าง? ==

ผู้ใช้ SVN/CVS หลายคนคาดหวังว่าจะเก็บหลายๆโปรเจคไว้ใน repository เดียว แต่ Mercurial ไม่ได้ถูกออกแบบมาเพื่อสนับสนุนการใช้แบบนี้ซักเท่าไร เพราะฉะนั้นคุณอาจจะอยากลองเปลี่ยนวิธีการทำงานของคุณดู เหตุผลก็คือคุณไม่สามารถดึงแค่ไดเร็คทอรี่ใดไดเร็คทอรี่หนึ่งมาจาก repository ของ Mercurial ได้ แต่ถ้าคุณต้องการเก็บหลายๆโปรเจคในจริงๆคุณอาจจะอยากลองศึกษาดู ForestExtension



สำหรับการแนะนำเกี่ยวกับวิธีการใช้งาน Mercurial แบบมีตัวอย่างลองดู[:ThaiTutorial:บทเรียนการใช้งาน Mercurial]

รูปแบบการทำงานแบบกระจายอำนาจ (decentralized) ของ Mercurial อาจทำให้ผู้ใช้ใหม่หลายๆคนงง หน้านี้พยายามที่จะอธิบายคอนเซ็ปต์พื้นฐานต่างๆเพื่อให้ผู้ใช้เข้าใจได้ง่ายขึ้น ดู[:ThaiTutorial:บทเรียน]สำหรับขั้นตอนแบบละเอียด

(คำแปล: [:BrazilianPortugueseUnderstandingMercurial:ภาษาโปรตุเกสบราซิล], [:ChineseUnderstandingMercurial:ภาษาจีน], [:FrenchUnderstandingMercurial:ภาษาฝรั่งเศษ], [:GermanUnderstandingMercurial:ภาษาเยอรมัน], [:ItalianUnderstandingMercurial:ภาษาอิตาลี], [:JapaneseUnderstandingMercurial:ภาษาญี่ปุ่น], [:KoreanUnderstandingMercurial:ภาษาเกาหลี], [:RussianUnderstandingMercurial:ภาษารัสเซีย], [:SpanishUnderstandingMercurial:ภาษาสเปน] )

สารบัญ

อะไรอยู่ใน Repository

[:Repository:repository] ของ Mercurial ประกอบไปด้วย[:WorkingDirectory:ไดเร็คทอรี่ทำงาน]กับ store:

store คือที่เก็บประวัติทั้งหมดของโปรเจค ความแตกต่างของ Mercurial จาก [:SCM:SCMs] ทั่วไปก็คือปกติแล้ว SCM อื่นๆจะเก็บประวัติทั้งหมดไว้ที่ศูนย์กลางที่เดียว แต่ใน Mercurial ทุกๆไดเร็คทอรี่ทำงาน (working directory) จะมีประวัติเหล่านี้พ่วงมาด้วยเหมือนเป็นสำเนาส่วนตัว การทำแบบนี้จะทำให้สามารถทำงานขนานกันไปได้

ไดเร็คทอรี่ทำงานจะถือสำเนาของไฟล์ต่างๆ ณ เวลาใดเวลาหนึ่ง (เช่น การแก้ไขหรือที่เรียกว่า rev ครั้งที่ 2 เป็นต้น) ซึ่งคุณก็สามารถแก้ไขไฟล์ในไดเร็คทอรี่ได้ และเนื่องจากว่า[:Tag:ป้ายกำกับ (tags)]และ[:.hgignore:ไฟล์ที่ถูกเพิกเฉย (ignored files)]ก็ถูกเก็บประวัติด้วย ทั้งสองก็ถูกเก็บอยู่ใน repository เช่นกัน

การคอมมิท(บันทึก) การแก้ไข

เมื่อคุณ[:Commit:คอมมิท]การแก้ไข ไฟล์ที่อยู่ในไดเร็คทอรี่ทำงานของคุณจะถูกเก็บเป็น [:ChangeSet:changeset] ใหม่ (หรือจะเรียกว่า "[:Revision:revision]" ใหม่ก็ได้) โดยมี[:Parent:บรรพบุรุษ]เป็นบรรพบุรุษของไดเร็คทอรี่ทำงานในขณะนั้น:

สังเกตุว่าในรูปภาพ revision 4 เป็น [:Branch:branch] ของ revision 2 ซึ่งเป็น revision ในไดเร็คทอรี่ทำงาน หลังจากคอมมิท revision 4 จะกลายเป็น บรรพบุรุษ ของไดเร็คทอรี่ทำงานแทน

Revisions, Changesets, Heads, และ Tip

Mercurial รวมการแก้ไขในหลายๆไฟล์ไว้ด้วยกันเป็นกลุ่มเพื่อที่จะคอมมิทเป็น [:ChangeSet:changeset] หรือเรียกอีกชื่อนึงได้ว่า revision ของโปรเจค แต่ละ revision ก็จะมีตัวเลขเป็นตัวแทนเรียกว่า [:RevisionNumber:revision number] ซึ่งจะเพิ่มขึ้นตามลำดับ และเนื่องจากว่า Mercurial อนุญาติให้ผู้ใช้หลายๆคนทำงานขนานกันในหลายๆ repository ตัวเลข revision number ของผู้ใช้แต่ละคนอาจไม่ตรงกัน Mercurial จึงให้ตัวเลขอีกตัวเลขนึงเป็นตัวแทนของแต่ละ changset ในทุกๆ repository ตัวเลขนี้เป็นตัวเลขฐานสิบหกยาว 40 หลักเรียกว่า [:ChangeSetID:changeset ID] และสามารถถูกย่อได้ตราบใดที่บ่งบอกถึง changeset ที่ไม่กำกวมเช่น "e38487"

การ branch และ[:Merge:รวมการแก้ไข]สามารถเกิดขึ้นตรงจุดใดก็ได้ในประวัติการแก้ไข แต่ละ branch ที่ยังไม่ได้ถูกรวมจะสร้างสิ่งที่เรียกว่า [:Head:head] ใหม่ในประวัติการแก้ไข ในรูปภาพด้านบน revisions 5 และ 6 คือ head แต่ Mercurial ให้ความหมายของ revision 6 ว่าเป็น[:Tip:ปลาย]ของ repository ด้วยเพราะว่าเป็น head ที่มีตัวเลข revision number สูงที่สุด Revision 4 เรียกว่า [:MergeChangeset:merge changeset] เพราะว่าเป็น changeset ที่เกิดจากการรวมของ changeset สอง อันทีเป็นบรรพบุรุษ (คือ revisions 2 และ 3)

การทำสำเนา, แก้ไข, รวมการแก้ไข, ดึงการแก้ไข และอัพเดท

สมมุติว่าเรามีผู้ใช้คนนึงชื่ออลิซ ซึ่งมี repository แบบนี้:

บ๊อบ[:Clone:ทำสำเนา] repository ของอลิซเป็น repository ส่วนตัวของตัวเองที่เป็นเอกเทศจากตัวต้นแบบของอลิซ และก็มีไฟล์ของเวอร์ชั่นปลายซึ่งก็คือ revision d ในไดเร็คทอรี่ทำงานของเขา:

ตอนนี้บ๊อบสามารถทำงานได้เป็นอิสระจากอลิซ บ๊อบทำการแก้ไขและ[:Commit:คอมมิท]การแก้ไขสองครั้งคือ e และ f:

ในขณะเดียวกันอลิซก็ทำการแก้ไข g เช่นกัน ทำให้ประวัติการแก้ไขใน repository ของเธอแตกแขนงออกไปจากของบ๊อบและทำให้เกิด [:Branch:branch] ขึ้น:

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

และเนื่องจากว่าการแก้ไข g ของอลิซกลายเป็น head ใหม่ใน repository ของบ๊อบมันเลยกลายเป็น ปลาย ของ repository ด้วย

จากนั้นบ๊อบก็ทำการ[:Merge:รวมการแก้ไข]ซึ่งก็คือการรวมการแก้ไขล่าสุดของเขา (f) กับปลายของ repository หลังจากการรวม ไดเร็คทอรี่ทำงานของเค้าก็จะมีบรรพบุรุษ 2 revisions คือ f และ g:

หลังจากตรวจสอบดูว่าการรวมการแก้ไขในไดเร็คทอรี่ทำงานของเขาเป็นไปด้วยดีไม่มีอะไรผิดพลาด บ๊อบก็คอมมิทและสร้าง [:MergeChangeset:merge changeset] ใหม่คือ h ใน store ของ repository เขา:

ตอนนี้ถ้าอลิซดึงการแก้ไขจากบ๊อบ เธอจะเห็นประวัติการแก้ไขจากบ๊อบคือ e, f, และ h ใน store ของเธอด้วย:

สังเกตุว่าไดเร็คทอรี่ทำงานของอลิซไม่ถูกเปลี่ยนเนื่องจากการดึงการแก้ไข เธอจะต้องทำการ[:Update:อัพเดท]เพื่อทำให้ไดเร็คทอรี่ทำงานมีเนื้อหาตรงกับ changset h การอัพเดทจะทำให้บรรพบุรุษของไดเร็คทอรี่ทำงานเปลี่ยนเป็น changeset h และทำให้เนื้อหาของไฟล์ในไดเร็คทอรี่ทำงานตรงกับเนื้อหาของ revision h.

ถึงตอนนี้ทั้งอลิซและบ๊อบมีทั้งประวัติการแก้ไขและเนื้อหาในไดเร็คทอรี่ทำงานตรงกันอีกครั้ง

ระบบการทำงานแบบแยกศูนย์

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

ต่างจากระบบเวอร์ชั่นคอนโทรลแบบรวมศูนย์อื่นๆซึ่งการแก้ไขเพื่อทดลองอะไรๆ อาจก่อให้เกิดปัญหา ระบบ DVCS อย่าง Mercurial สามารถทำให้คุณทดลองได้อย่างง่ายดายโดยการทำสำเนาของ repository และก็เริ่มแก้ไขได้เลย ถ้าการแก้ไขเป็นไปได้ด้วยดี คุณก็แค่ push ไปที่ repository อื่น แต่ถ้าคุณไม่ชอบก็ลบ repository ทิ้งและลองวิธีอื่นแทน

Mercurial ทำอะไรไม่ได้บ้าง?

ผู้ใช้ SVN/CVS หลายคนคาดหวังว่าจะเก็บหลายๆโปรเจคไว้ใน repository เดียว แต่ Mercurial ไม่ได้ถูกออกแบบมาเพื่อสนับสนุนการใช้แบบนี้ซักเท่าไร เพราะฉะนั้นคุณอาจจะอยากลองเปลี่ยนวิธีการทำงานของคุณดู เหตุผลก็คือคุณไม่สามารถดึงแค่ไดเร็คทอรี่ใดไดเร็คทอรี่หนึ่งมาจาก repository ของ Mercurial ได้ แต่ถ้าคุณต้องการเก็บหลายๆโปรเจคในจริงๆคุณอาจจะอยากลองศึกษาดู ForestExtension

สำหรับการแนะนำเกี่ยวกับวิธีการใช้งาน Mercurial แบบมีตัวอย่างลองดู[:ThaiTutorial:บทเรียนการใช้งาน Mercurial]

ThaiUnderstandingMercurial (last edited 2012-11-11 13:31:09 by abuehl)