Multi Merge

ในการทำงานร่วมกันหลายคน ย่อมมี branch เกิดขึ้นมากมายแน่นอน (มันคงไม่มีประโยชน์ถ้าจะรอให้คนนึงทำงานแรกเสร็จก่อน แล้วค่อยอนุญาตให้อีกคนทำงานถัดมา) ความสามารถในการ merge หลายๆ branch ที่แตกออกมาในเวลาเดียวกันนั้น จึงเป็นสิ่งที่โปรแกรม SCM ควรทำได้อย่างเป็นเรื่องปรกติธรรมดา

ตอนนี้จะทดสอบการ merge หลาย branch โดยเพิ่มความสามารถ 2 อย่างให้โปรเจค hello

ความสามารถแรกคือการแสดง help ซึ่งสามารถเรียกโดยเพิ่ม -h ทาง command line เช่นเดียวกับโปรแกรมทั่วๆ ไปครับ

    $ git checkout -b show-help
    Switched to a new branch 'show-help'

แก้ code ในไฟล์ hello.py ดังนี้

    import sys

    names = sys.argv[1:]

    if '-h' in names:
        exit('usage: python hello.py [-h] [NAME [NAME ...]]')

    if not names:
        print('Hello, world!')

    for name in names:
        print('Hi {}.'.format(name))

(ทดสอบแล้วผ่าน) ก็ commit ตามปรกติครับ

    $ git commit -am 'add option -h as show help'
    [show-help 052a17b] add option -h as show help
     1 file changed, 3 insertions(+)

เรียบร้อยกับความสามารถแรกไปแล้ว ทีนี้มาเพิ่มความสามารถที่สอง โดยกลับไปแตก branch มาจากตัว master นะครับ

    $ git checkout master
    Switched to branch 'master'
    $ git checkout -b sort-name
    Switched to a new branch 'sort-name'

ความสามารถนี้ จะทำการเรียงลำดับชื่อที่รับเข้ามาก่อน แล้วค่อยทักทายแต่ละชื่อที่เรียงแล้วนั้น ซึ่งสามารถเรียกโดยเพิ่ม -s เข้าไปตอนเรียกโปรแกรมครับ

    import sys

    names = sys.argv[1:]

    if not names:
        print('Hello, world!')

    if '-s' in names:
        names.remove('-s')
        names.sort()

    for name in names:
        print('Hi {}.'.format(name))

(ทดสอบกันเอง) แล้วก็ commit ครับ

    $ git commit -am 'add option -s as sorted name'
    [sort-name a973745] add option -s as sorted name
     1 file changed, 4 insertions(+)

สลับกลับมาที่ master ถึงตอนนี้เราอาจจะลืมไปแล้วว่าได้ทำการเปลี่ยนแปลงอะไรไว้ที่ branch อื่นบ้าง เราสามารถสั่งให้แสดงความแตกต่างระหว่าง branch ดังนี้ครับ

    $ git checkout master
    Switched to branch 'master'
    $ git diff master show-help
    diff --git a/hello.py b/hello.py
    index 728f301..13c71ed 100644
    --- a/hello.py
    +++ b/hello.py
    @@ -2,6 +2,9 @@ import sys

     names = sys.argv[1:]

    +if '-h' in names:
    +    exit('usage: python hello.py [-h] [NAME [NAME ...]]')
    +
     if not names:
         print('Hello, world!')

ข้อมูล 4 บรรทัดแรกจากคำสั่ง diff จะบอกว่าทำการหาความแตกต่างระหว่าง branch ไหน ข้อมูลในบรรทัดที่ 5 (ขึ้นต้นด้วยเครื่องหมาย @@) จะบอกช่วงบรรทัดที่นำมาแสดง และข้อมูลที่เหลือจะแสดงอยู่ในรูปของ patch file คือถ้ามีเครื่องหมาย + หมายถึงมีข้อมูลเพิ่มขึ้นมา เครื่องหมาย - คือข้อมูลที่ถูกลบทิ้งครับ

เมื่อพร้อมแล้วก็ merge กันเลย

    $ git merge show-help sort-name
    Fast-forwarding to: show-help
    Trying simple merge with sort-name
    Simple merge did not work, trying automatic merge.
    Auto-merging hello.py
    Merge made by the 'octopus' strategy.
     hello.py |    7 +++++++
     1 file changed, 7 insertions(+)

สังเกตว่าการ merge ย่อยครั้งแรก (show-help) แม้จะเป็นการ Fast-forward เช่นเดียวกับที่ผ่านมา แต่เมื่อ merge เสร็จ จะมี code ส่วนที่ตรวจว่ามีการขอ help หรือเปล่าเพิ่มขึ้น ทำให้บรรทัดต่างๆ ใน code ส่วนที่เหลือถูกเลื่อนลงมาข้างล่างด้วย เมื่อ Git พยายามจะ merge ครั้งถัดมา (sort-name) มันจะทำการเลื่อน code ส่วนที่ต้องตรวจว่าจะ sort หรือเปล่าลงไปให้เองโดยอัตโนมัติครับ (เปิดไฟล์ hello.py เพื่อศึกษาผลลัพท์)

เสร็จแล้วก็อย่าลืมลบ branch ทิ้งนะครับ

    $ git branch show-help sort-name -d
    Deleted branch show-help (was 052a17b).
    Deleted branch sort-name (was a973745).

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus