Size: 6773
Comment: Put into Thai category
|
← Revision 4 as of 2009-05-19 19:31:03 ⇥
Size: 7291
Comment: converted to 1.6 markup
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
== บทเรียน - รวมการแก้ไขที่ขัดแย้งกัน == | == บทเรียน - รวมประวัติการแก้ไขที่ขัดแย้งกัน == |
Line 3: | Line 3: |
''(หน้านี้เป็นหน้าที่ 8 จาก 9 ของ[:ThaiTutorial:บทเรียน]การใช้งาน Mercurial หน้าก่อนหน้าคือ [:ThaiTutorialMerge], หน้าถัดไปคือ [: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: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: |
เราต้องใช้คำสั่ง {{{hg merge}}} เหมือนกับที่เราทำในบท [:ThaiTutorialMerge] แต่คำสั่งนี้จะไม่สามารถรวมการแก้ไขได้โดยอัตโนมัติอีกแล้วเพราะว่ามีการแก้ไขบรรทัดที่ขัดแย้งกันจาก 2 changeset (อันแรกคืออันที่เราเพิ่ง[:Commit:คอมมิท] ส่วนอีกอันคืออันที่เราเพิ่งดึงมา | Mercurial บอกเราว่าเราต้องใช้คำสั่ง {{{hg merge}}} เหมือนกับที่เราทำใน[[ThaiTutorialMerge|บทที่แล้ว]] แต่คำสั่งนี้จะไม่สามารถรวมการแก้ไขได้โดยอัตโนมัติอีกแล้วเพราะว่ามีการแก้ไขบรรทัดที่ขัดแย้งกันจากเซ็ตการเปลี่ยนแปลง 2 เซ็ต (อันแรกคืออันที่เราเพิ่ง[[Commit|คอมมิท]] ส่วนอีกอันคืออันที่เราเพิ่งดึงมา |
Line 68: | Line 68: |
ถึงตรงนี้สิ่งที่เกิดขึ้นจะขึ้นอยู่กับว่าเราตั้งค่า Mercurial ไว้ยังไง (ดู [:MergeToolConfiguration]) โดยปกติ Mercurial จะเปิด editor และแสดงสัญลักษณ์สำหรับส่วนที่ขัดแย้งกันเพื่อให้เราแก้ไขด้วยมือ: | ถึงตรงนี้สิ่งที่เกิดขึ้นจะขึ้นอยู่กับว่าเราตั้งค่า Mercurial ไว้ยังไง (ดู [[MergeToolConfiguration]]) โดยปกติ Mercurial จะเปิด editor และแสดงสัญลักษณ์สำหรับส่วนที่ขัดแย้งกันเพื่อให้เราแก้ไขด้วยมือ: |
Line 94: | Line 94: |
ใน editor เราจะต้องลบสัญลักษณ์ความขัดแย้ง เก็บบรรทัด "sure am glad I'm using Mercurial!\n" เอาไว้ และลบบรรทัดที่เกี่ยวกับ CVS ออกไปซะ ตอนที่เราปิด editor Mercurial จะถามเราว่า: | สำหรับตัวอย่างนี้เราจะลบสัญลักษณ์ความขัดแย้งทิ้งและเก็บบรรทัด "sure am glad I'm using Mercurial!\n" เอาไว้ และลบบรรทัดที่เกี่ยวกับ CVS ออกไปซะ ตอนที่เราปิดโปรแกรม editor Mercurial จะถามเราว่า: |
Line 100: | Line 100: |
ให้ตอบไปว่า "y" และ Mercurial จะรายงานผลการรวมการแก้ไขด้วยมือให้เราทราบว่า: | ให้ตอบไปว่า "y" และ Mercurial จะรายงานผลจากการรวมการแก้ไขด้วยมือให้เราทราบว่า: |
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.
เอาล่ะ ในที่สุดก็ใกล้จบบทเรียนแล้ว! อ่านดูบทสรุปกันได้เลย