สถานการณ์การ Merge ที่ซับซ้อน

Git ขั้นสูง

Amanda Crawford-Adamo

Software and Data Engineer

Repo สำหรับ data pipeline ข้อมูลเที่ยวบิน

กราฟแสดงโครงสร้างไดเรกทอรีและไฟล์ของ repo สำหรับ data pipeline ข้อมูลเที่ยวบิน ใน working directory มีไฟล์ 4 ไฟล์ ได้แก่ etl.py, load.py, transform.py และ ingest.py ใน data directory มีโฟลเดอร์ข้อมูล flight_data.csv และแสดง git folder ด้วย

Git ขั้นสูง

Git squash merging

$$

การทำงาน

  • สร้าง commit ใหม่เพียงหนึ่งรายการบน target branch
  • รวมการเปลี่ยนแปลงทั้งหมดจาก source branch
    • เพิ่ม commit ปกติที่มี parent เดียว (ต่างจาก recursive strategy)
  • เพิ่มใน target branch (ไม่ใช่ feature branch)
    • ไม่เก็บประวัติ commit แบบละเอียดของ source branch

$$

ข้อดี

  • ประวัติสะอาดและเป็นเส้นตรง
  • ช่วยให้รีวิวโค้ดสำหรับฟีเจอร์ขนาดใหญ่ง่ายขึ้น
  • ย้อนกลับทั้งฟีเจอร์ได้ง่ายกว่า
Git ขั้นสูง

ตัวอย่าง merge squash

branch data-cleanup แยกออกจาก main branch หลัง commit ที่สอง main branch มี commit เพิ่มหนึ่งรายการ และ data-cleanup มี commit เพิ่มอีกสองรายการ

Git ขั้นสูง

กระบวนการ merge squash

  1. Checkout ไปที่ main branch

    $ git checkout main
    
  2. สร้าง squash commit จากการเปลี่ยนแปลงทั้งหมดใน data-cleanup

    $ git merge --squash data-cleanup
    
  3. Commit squash commit ลงใน history ของ main branch

    $ git commit -m "Implement and optimize data cleanup"
    
Git ขั้นสูง

ผลลัพธ์ของ merge squash

กราฟแสดง 2 branch ได้แก่ main และ data-cleanup branch main มี 4 commits และ feature branch แยกออกหลัง commit ล่าสุดของ main โดยมี commit เพิ่มหนึ่งรายการ commit ล่าสุดของ main เป็น single parent commit object ที่รวม commit จาก data-cleanup ไว้แล้ว

Git ขั้นสูง

Git octopus merge

$$

การทำงาน

  • Merge สาม branch ขึ้นไปพร้อมกันในครั้งเดียว
  • สร้าง merge commit เดียวที่มีหลาย parent
  • เหมาะที่สุดเมื่อ branch ไม่ขัดแย้งกัน

$$

ข้อดี

  • มีประโยชน์สำหรับการรวมฟีเจอร์อิสระหลายรายการพร้อมกัน
  • ใช้ซิงค์ release branch หลายสาขาสำหรับเวอร์ชันต่าง ๆ ของโปรเจกต์
Git ขั้นสูง

ตัวอย่าง octopus merge

ภาพแสดง development branch 4 สาย ได้แก่ main, ingestion, transform และ load branch ของ ingestion, transform และ load แยกออกจาก main หลัง commit แรก โดยแต่ละสายมี commit เพิ่มหนึ่งรายการ main branch มี commit เพิ่มหนึ่งรายการเช่นกัน

Git ขั้นสูง

คำสั่ง octopus merge

คำสั่ง Git Octopus Merge

git merge -s octopus

ตัวอย่าง

$ git merge -s octopus ingest transform load
Trying simple merge with ingest
Trying simple merge with transform
Trying simple merge with load
Merge made by the 'octopus' strategy.
...
Git ขั้นสูง

ผลลัพธ์ของ octopus merge

ภาพแสดง development branch 4 สาย ได้แก่ main, ingestion, transform และ load branch ของ ingestion, transform และ load แยกออกจาก main หลัง commit แรก โดยแต่ละสายมี commit เพิ่มหนึ่งรายการ main branch มี 5 commits ที่รวม commit จาก branch อื่นไว้แล้ว และ merge commit สุดท้ายมี 4 parent ได้แก่ commit ก่อนหน้าของ main และ commit ล่าสุดจาก ingest, transform และ load

Git ขั้นสูง

สรุป

Squash merge

  • ทำให้ประวัติเรียบง่าย โดยรวม commit หลายรายการเป็นหนึ่ง
  • ใช้เมื่อต้องการประวัติที่สะอาดและกระชับ
    git merge --squash <source_branch>
    

Octopus merge

  • คงโครงสร้าง branch ไว้
  • Merge หลาย branch พร้อมกันในครั้งเดียว
  • เหมาะสำหรับการรวมงานพัฒนาแบบขนานหลายสาย
    git merge -s octopus <branch 1> <branch 2> <branch 3>
    
Git ขั้นสูง

มาฝึกกันเถอะ!

Git ขั้นสูง

Preparing Video For Download...