ความสามารถในการผสานที่ง่ายของ git เป็นหนึ่งในจุดแข็งของมัน ในระหว่างการผสาน git ใช้การผสานไปข้างหน้าอย่างรวดเร็วเมื่อสังเกตว่า HEAD ของสาขาปัจจุบันเป็นบรรพบุรุษของการกระทำที่คุณกำลังพยายามผสาน ในการผสานแบบกรอไปข้างหน้า ไม่มีการคอมมิตใหม่ Git เพียงแค่เลื่อนตัวชี้ หากพฤติกรรมนี้ไม่เป็นที่ต้องการ คุณสามารถใช้แฟล็ก no-ff เพื่อสร้างคอมมิตใหม่สำหรับการผสาน
การผสานจะดูมีและไม่มีการกรอไปข้างหน้าอย่างไร
หลังจากกรอไปข้างหน้า ประวัติ git ของคุณจะมีลักษณะดังนี้:
C0 —> C1 —> C2—> C3
สำหรับจำนวนคอมมิตที่เท่ากัน นี่คือประวัติการรวมโดยไม่ต้องกรอไปข้างหน้า:
ในกรณีแรกไม่มีข้อบ่งชี้ว่ามีการแตกแขนง ในกรณีที่สอง ประวัติแสดงการคอมมิต C4 เพื่อระบุว่าเกิดการผสานที่ใด
เดินผ่านตัวอย่าง
คุณจะสร้างที่เก็บ git สร้างสาขา จากนั้นลองผสานทั้งแบบมีและไม่มีการกรอไปข้างหน้า
ส่วนที่ 1: การตั้งค่า
ขั้นแรก คุณสามารถสร้างที่เก็บ git ด้วยขั้นตอนต่อไปนี้:
$ mkdir my_project$ cd my_project
$ git init
$ แตะ a.txt
$ git เพิ่ม -A
$ git commit -m 'C0: การเพิ่ม a.txt'
ตอนนี้ มาสร้างสาขาที่เรียกว่าคุณสมบัติและทำการเปลี่ยนแปลงบางอย่าง:
$ คุณสมบัติสาขา gitคุณสมบัติการชำระเงิน $ git
$ แตะ b.txt
$ git เพิ่ม -A
$ git commit -m 'C1: การเพิ่ม b.txt'
$ แตะ c.txt
$ git เพิ่ม -A
$ git commit -m 'C2: การเพิ่ม c.txt'
$ สัมผัส d.txt
$ git เพิ่ม -A
$ git commit -m 'C3: การเพิ่ม d.txt'
ส่วนที่ 2: ผสานกับการส่งต่ออย่างรวดเร็ว
กลับไปที่มาสเตอร์แบรนช์และรวมฟีเจอร์แบรนช์เข้ากับมัน:
$git checkoutผู้เชี่ยวชาญ$git mergeคุณสมบัติ
เอาท์พุท:
กำลังปรับปรุง 08076fb..9ee88ebกรอไปข้างหน้า
b.txt | 0
c.txt | 0
d.txt | 0
เปลี่ยนแปลง 3 ไฟล์, แทรก 0 (+), 0 การลบ (-)
สร้างโหมด 100644 b.txt
สร้างโหมด 100644 c.txt
สร้างโหมด 100644 d.txt
หากคุณตรวจสอบประวัติ คุณจะเห็น:
$ บันทึก git --oneline9ee88eb C3: การเพิ่ม d.txt
c72b92c C2: การเพิ่ม c.txt
2e4039e C1: การเพิ่ม b.txt
08076fb C0: กำลังเพิ่ม a.txt
ดังนั้นการคอมมิตทั้งหมดจากสาขาฟีเจอร์จะอยู่ในมาสเตอร์แบรนช์ตอนนี้ หากคุณทำการเปลี่ยนแปลงต้นแบบต่อไป จะไม่มีทางทราบได้ว่าเมื่อใดที่รวมสาขาคุณสมบัติเข้ากับมัน
ส่วนที่ 3: ไม่มีการกรอไปข้างหน้า
ทำซ้ำส่วนที่ 1 สำหรับโฟลเดอร์ใหม่
จากนั้น ลองผสานโดยไม่ต้องกรอไปข้างหน้า:
$git checkoutผู้เชี่ยวชาญ$git merge --no-ffลักษณะเฉพาะ
มันจะเปิดสิ่งต่อไปนี้ในตัวแก้ไขข้อความเริ่มต้นของ git ของคุณ:
รวมสาขา'คุณสมบัติ'# โปรดป้อนข้อความยืนยันเพื่ออธิบายว่าทำไมการควบรวมนี้จึงมีความจำเป็น
# โดยเฉพาะอย่างยิ่งหากรวมอัปสตรีมที่อัปเดตเข้ากับสาขาของหัวข้อ
#
# บรรทัดที่ขึ้นต้นด้วย '#' จะถูกละเว้น และข้อความว่างจะยกเลิก
#คอมมิชชั่น.
แก้ไขความคิดเห็น ในกรณีนี้ คุณสามารถเพิ่ม C4: ก่อนผสาน 'คุณสมบัติ' ของสาขา ผลลัพธ์ควรมีลักษณะดังนี้:
ผสานโดยกลยุทธ์ 'แบบเรียกซ้ำ'b.txt | 0
c.txt | 0
d.txt | 0
เปลี่ยนแปลง 3 ไฟล์, แทรก 0 (+), 0 การลบ (-)
สร้างโหมด 100644 b.txt
สร้างโหมด 100644 c.txt
สร้างโหมด 100644 d.txt
ตอนนี้ หากคุณตรวจสอบประวัติควรมีลักษณะดังนี้:
$ บันทึก git --onelinee071527 C4: ผสาน 'คุณสมบัติ' ของสาขา
bb79c25 C3: การเพิ่ม d.txt
692bd8c C2: การเพิ่ม c.txt
a0df62a C1: การเพิ่ม b.txt
7575971 C0: การเพิ่ม a.txt
คุณจะเห็นได้ว่าถึงแม้คุณจะมีการเปลี่ยนแปลงเหมือนกัน แต่การผสานเวอร์ชันนี้มีคอมมิต C4 พิเศษ ซึ่งหมายถึงการรวมสาขาของคุณลักษณะเข้าเป็นต้นแบบ
บทสรุป
ค่าสถานะ git merge no-ff ช่วยสร้างประวัติที่อ่านง่ายขึ้น ช่วยให้คุณสามารถใส่แท็กที่แสดงตำแหน่งที่เกิดการผสานได้อย่างชัดเจน มันสามารถประหยัดเวลาและความพยายามของคุณในระหว่างการดีบัก