Differences between revisions 1 and 2
Revision 1 as of 2008-11-19 16:07:31
Size: 6759
Comment: Translate TutorialConflict to Thai
Revision 2 as of 2008-11-21 09:42:52
Size: 6773
Comment: Put into Thai category
Deletions are marked like this. Additions are marked like this.
Line 119: Line 119:
CategoryThai

บทเรียน - รวมการแก้ไขที่ขัดแย้งกัน

(หน้านี้เป็นหน้าที่ 8 จาก 9 ของ[:ThaiTutorial:บทเรียน]การใช้งาน Mercurial หน้าก่อนหน้าคือ [:ThaiTutorialMerge], หน้าถัดไปคือ [:ThaiTutorialConclusion])

เราได้เรียนรู้วิธีการ[:Merge:รวมการแก้ไข]แบบง่ายๆในบท ThaiTutorialMerge

Mercurial สามารถจัดการกับกรณีที่ยากขึ้นได้เช่นกัน ไม่ใช่เรื่องแปลกถ้าคนสองคนจะแก้ไขบรรทัดเดียวกันในไฟล์จากนั้นก็ต้องมาดูว่าจะแก้ไขยังไง กรณีแบบนี้เรียกว่า[:Conflict:ความขัดแย้ง]; เมื่อมีความขัดแย้งก็ย่อมต้องมี[:ResolveConflict:การแก้ไขปัญหาความขัดแย้ง]เช่นกัน

ก่อนอื่นเรามาลองสร้างกรณีที่ให้เกิดความขัดแย้งกันก่อน เริ่มจากการ[:Clone:ทำสำเนา]ของ my-hello:

$ cd ..
$ hg clone my-hello my-hello-not-cvs
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved

ทีนี้ให้เพิ่มบรรทัดใหม่ในไฟล์ hello.c:

$ cd my-hello-not-cvs
$ vi hello.c

เราจะแก้ไข main ให้เป็นแบบนี้:

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        printf("sure am glad I'm not using CVS!\n");
        return 0;
}

จากนั้นเราจะ[:Commit:คอมมิท]การแก้ไข:

$ hg commit -m "Give thanks for dodging bullet"

ระลึกชาติจากบท ThaiTutorialFirstChange ว่าเราสร้าง [:ChangeSet:changeset] ใน my-hello-new-output ซึ่งก็มีการแก้ไขบรรทัดที่สองเช่นกัน จะเกิดอะไรขึ้นถ้าเราพยายาม[:Pull:ดึงการแก้ไข]นั้นเข้ามาใน repository นี้นะ?

$ hg pull ../my-hello-new-output
pulling from ../my-hello-new-output
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

โอเค ยังไม่มีปัญหาอะไร ทีนี้ลองใช้คำสั่ง [:Update:update]

$ hg update
abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes

เราต้องใช้คำสั่ง hg merge เหมือนกับที่เราทำในบท [:ThaiTutorialMerge] แต่คำสั่งนี้จะไม่สามารถรวมการแก้ไขได้โดยอัตโนมัติอีกแล้วเพราะว่ามีการแก้ไขบรรทัดที่ขัดแย้งกันจาก 2 changeset (อันแรกคืออันที่เราเพิ่ง[:Commit:คอมมิท] ส่วนอีกอันคืออันที่เราเพิ่งดึงมา

$ hg merge

ถึงตรงนี้สิ่งที่เกิดขึ้นจะขึ้นอยู่กับว่าเราตั้งค่า Mercurial ไว้ยังไง (ดู [:MergeToolConfiguration]) โดยปกติ Mercurial จะเปิด editor และแสดงสัญลักษณ์สำหรับส่วนที่ขัดแย้งกันเพื่อให้เราแก้ไขด้วยมือ:

/*
 * 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");
<<<<<<< /home/adi/tmp/tutorial/my-hello-not-cvs/hello.c
        printf("sure am glad I'm not using CVS!\n");
=======
        printf("sure am glad I'm using Mercurial!\n");
>>>>>>> /tmp/hello.c~other.2xAVqv
        return 0;
}

ใน editor เราจะต้องลบสัญลักษณ์ความขัดแย้ง เก็บบรรทัด "sure am glad I'm using Mercurial!\n" เอาไว้ และลบบรรทัดที่เกี่ยวกับ CVS ออกไปซะ ตอนที่เราปิด editor Mercurial จะถามเราว่า:

Was the merge successful? [y/n]

ให้ตอบไปว่า "y" และ Mercurial จะรายงานผลการรวมการแก้ไขด้วยมือให้เราทราบว่า:

0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

อย่าลืมคอมมิทการแก้ไขของเราเมื่อรวมเสร็จแล้ว:

$ hg commit -m "Merged changes from my-hello-new-output"

ในที่นี้เราได้เห็นพฤติกรรมปกติของ Mercurial แต่เราก็สามารถตั้งค่า Mercurial ให้ใช้เครื่องมือการรวมการแก้ไขอื่นๆได้ เช่นเครื่องมือการรวมการแก้ไขแบบสามทาง (three-way merge tools) คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าเครื่องมือการรวมการแก้ไขแบบสามทางได้ที่ [:MergeToolConfiguration].

ในที่สุดก็ใกล้จบบทเรียนแล้ว อ่านดูบทสุดท้ายกันได้เลยที่ [:ThaiTutorialConclusion]


CategoryTutorial CategoryThai

ThaiTutorialConflict (last edited 2009-05-19 19:31:03 by localhost)