Differences between revisions 3 and 4
Revision 3 as of 2008-11-22 14:02:25
Size: 7273
Comment: Edit contents to make reading easier.
Revision 4 as of 2009-05-19 19:31:03
Size: 7291
Editor: localhost
Comment: converted to 1.6 markup
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
''(บทนี้เป็นบทที่ 8 จาก 9 บทของ[:ThaiTutorial:บทเรียนการใช้งาน Mercurial] บทก่อนหน้าคือ [:ThaiTutorialMerge:รวมประวัติการแก้ไขจาก repository อื่น], บทถัดไปคือ [:ThaiTutorialConclusion:บทสรุป])'' ''(บทนี้เป็นบทที่ 8 จาก 9 บทของ[[ThaiTutorial|บทเรียนการใช้งาน Mercurial]] บทก่อนหน้าคือ [[ThaiTutorialMerge|รวมประวัติการแก้ไขจาก repository อื่น]], บทถัดไปคือ [[ThaiTutorialConclusion|บทสรุป]])''
Line 5: Line 5:
เราได้เรียนรู้วิธีการ[:Merge:รวมประวัติการแก้ไข]แบบง่ายๆใน[:ThaiTutorialMerge:บทที่แล้ว] เราได้เรียนรู้วิธีการ[[Merge|รวมประวัติการแก้ไข]]แบบง่ายๆใน[[ThaiTutorialMerge|บทที่แล้ว]]
Line 7: Line 7:
Mercurial สามารถจัดการกับกรณีที่ยากกว่านี้ได้เช่นกัน คงไม่ใช่เรื่องแปลกถ้าคนสองคนจะแก้ไขบรรทัดเดียวกันในไฟล์แล้วต้องมาดูว่าจะทำยังไงกับการแก้ไขที่ชนกัน กรณีนี้เรียกว่าการแก้ไขที่มี[:Conflict:ความขัดแย้ง]; เมื่อมีความขัดแย้งก็ย่อมต้องมี[:ResolveConflict:การแก้ปัญหาความขัดแย้ง]เช่นกัน Mercurial สามารถจัดการกับกรณีที่ยากกว่านี้ได้เช่นกัน คงไม่ใช่เรื่องแปลกถ้าคนสองคนจะแก้ไขบรรทัดเดียวกันในไฟล์แล้วต้องมาดูว่าจะทำยังไงกับการแก้ไขที่ชนกัน กรณีนี้เรียกว่าการแก้ไขที่มี[[Conflict|ความขัดแย้ง]]; เมื่อมีความขัดแย้งก็ย่อมต้องมี[[ResolveConflict|การแก้ปัญหาความขัดแย้ง]]เช่นกัน
Line 9: Line 9:
ก่อนอื่นเรามาลองสร้างสถานการณ์ที่มีความขัดแย้งกันก่อน เริ่มจากการ[:Clone:ทำสำเนา]ของ {{{my-hello}}}: ก่อนอื่นเรามาลองสร้างสถานการณ์ที่มีความขัดแย้งกันก่อน เริ่มจากการ[[Clone|ทำสำเนา]]ของ {{{my-hello}}}:
Line 36: Line 36:
จากนั้นเราจะ[:Commit:คอมมิท]การแก้ไข: จากนั้นเราจะ[[Commit|คอมมิท]]การแก้ไข:
Line 42: Line 42:
ระลึกชาติจากบท[:ThaiTutorialFirstChange:ทำการแก้ไขแรกของคุณ]ว่าเรามี[:ChangeSet:เซ็ตการแก้ไข]ใน {{{my-hello-new-output}}} ซึ่งก็มีการแก้ไขบรรทัดที่สองเช่นกัน จะเกิดอะไรขึ้นถ้าเราพยายาม[:Pull:ดึงประวัติการแก้ไข]นั้นเข้ามาใน repository นี้นะ? ระลึกชาติจากบท[[ThaiTutorialFirstChange|ทำการแก้ไขแรกของคุณ]]ว่าเรามี[[ChangeSet|เซ็ตการแก้ไข]]ใน {{{my-hello-new-output}}} ซึ่งก็มีการแก้ไขบรรทัดที่สองเช่นกัน จะเกิดอะไรขึ้นถ้าเราพยายาม[[Pull|ดึงประวัติการแก้ไข]]นั้นเข้ามาใน repository นี้นะ?
Line 55: Line 55:
โอเค ยังไม่มีปัญหาอะไร ทีนี้ลองใช้คำสั่ง [:Update:update] โอเค ยังไม่มีปัญหาอะไร ทีนี้ลองใช้คำสั่ง [[Update|update]]
Line 62: Line 62:
Mercurial บอกเราว่าเราต้องใช้คำสั่ง {{{hg merge}}} เหมือนกับที่เราทำใน[:ThaiTutorialMerge:บทที่แล้ว] แต่คำสั่งนี้จะไม่สามารถรวมการแก้ไขได้โดยอัตโนมัติอีกแล้วเพราะว่ามีการแก้ไขบรรทัดที่ขัดแย้งกันจากเซ็ตการเปลี่ยนแปลง 2 เซ็ต (อันแรกคืออันที่เราเพิ่ง[:Commit:คอมมิท] ส่วนอีกอันคืออันที่เราเพิ่งดึงมา Mercurial บอกเราว่าเราต้องใช้คำสั่ง {{{hg merge}}} เหมือนกับที่เราทำใน[[ThaiTutorialMerge|บทที่แล้ว]] แต่คำสั่งนี้จะไม่สามารถรวมการแก้ไขได้โดยอัตโนมัติอีกแล้วเพราะว่ามีการแก้ไขบรรทัดที่ขัดแย้งกันจากเซ็ตการเปลี่ยนแปลง 2 เซ็ต (อันแรกคืออันที่เราเพิ่ง[[Commit|คอมมิท]] ส่วนอีกอันคืออันที่เราเพิ่งดึงมา
Line 68: Line 68:
ถึงตรงนี้สิ่งที่เกิดขึ้นจะขึ้นอยู่กับว่าเราตั้งค่า Mercurial ไว้ยังไง (ดู [:MergeToolConfiguration]) โดยปกติ Mercurial จะเปิด editor และแสดงสัญลักษณ์สำหรับส่วนที่ขัดแย้งกันเพื่อให้เราแก้ไขด้วยมือ: ถึงตรงนี้สิ่งที่เกิดขึ้นจะขึ้นอยู่กับว่าเราตั้งค่า Mercurial ไว้ยังไง (ดู [[MergeToolConfiguration]]) โดยปกติ Mercurial จะเปิด editor และแสดงสัญลักษณ์สำหรับส่วนที่ขัดแย้งกันเพื่อให้เราแก้ไขด้วยมือ:
Line 113: Line 113:
ตัวอย่างด้านบนคือพฤติกรรมปกติของ Mercurial เราสามารถตั้งค่า Mercurial ให้ใช้เครื่องมือการรวมการแก้ไขอื่นๆได้ เช่นเครื่องมือการรวมการแก้ไขแบบสามทาง (three-way merge tools) คุณสามารถอ่านข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าเครื่องมือการรวมการแก้ไขแบบสามทางได้ที่ [:MergeToolConfiguration]. ตัวอย่างด้านบนคือพฤติกรรมปกติของ Mercurial เราสามารถตั้งค่า Mercurial ให้ใช้เครื่องมือการรวมการแก้ไขอื่นๆได้ เช่นเครื่องมือการรวมการแก้ไขแบบสามทาง (three-way merge tools) คุณสามารถอ่านข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าเครื่องมือการรวมการแก้ไขแบบสามทางได้ที่ [[MergeToolConfiguration]].
Line 115: Line 115:
เอาล่ะ ในที่สุดก็ใกล้จบบทเรียนแล้ว! อ่านดู[:ThaiTutorialConclusion:บทสรุป]กันได้เลย เอาล่ะ ในที่สุดก็ใกล้จบบทเรียนแล้ว! อ่านดู[[ThaiTutorialConclusion|บทสรุป]]กันได้เลย

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

(บทนี้เป็นบทที่ 8 จาก 9 บทของบทเรียนการใช้งาน Mercurial บทก่อนหน้าคือ รวมประวัติการแก้ไขจาก repository อื่น, บทถัดไปคือ บทสรุป)

เราได้เรียนรู้วิธีการรวมประวัติการแก้ไขแบบง่ายๆในบทที่แล้ว

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

ก่อนอื่นเรามาลองสร้างสถานการณ์ที่มีความขัดแย้งกันก่อน เริ่มจากการทำสำเนาของ 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;
}

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

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

ระลึกชาติจากบททำการแก้ไขแรกของคุณว่าเรามีเซ็ตการแก้ไขใน my-hello-new-output ซึ่งก็มีการแก้ไขบรรทัดที่สองเช่นกัน จะเกิดอะไรขึ้นถ้าเราพยายามดึงประวัติการแก้ไขนั้นเข้ามาใน 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

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

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

$ 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;
}

สำหรับตัวอย่างนี้เราจะลบสัญลักษณ์ความขัดแย้งทิ้งและเก็บบรรทัด "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.

เอาล่ะ ในที่สุดก็ใกล้จบบทเรียนแล้ว! อ่านดูบทสรุปกันได้เลย


CategoryTutorial CategoryThai

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