แยกสาขา git ออกเป็นหลายสาขาเพื่อรวมเป็นสาขาหลัก

ทีมของฉันทำงานในสาขาต้นแบบจากต้นแบบ ตอนนี้ฉันต้องการทำงานนั้น แบ่งมันออกเป็น "สาขาฟีเจอร์" ต่างๆ และรวมงานเหล่านั้นทีละงานให้เป็นงานหลัก ฉันเห็นสองสามวิธีในการทำเช่นนี้ ซึ่งฉันก็ไม่ชอบทั้งสองวิธี:

1 - สร้างสาขาใหม่ Feature_1 จาก ต้นแบบ คัดลอกโค้ดจาก Prototype ไปยัง Feature_1 ด้วยตนเอง ซึ่งหมายความว่าฉันต้องติดตามสิ่งที่ฉันคัดลอกไว้เมื่อไปสร้าง Feature_N และฉันเสียประวัติไป

2 - สร้างสาขาใหม่ Feature_1 จาก ต้นแบบ คืนค่าโค้ดที่ไม่ได้เป็นส่วนหนึ่งของฟีเจอร์แรกใน Feature_1 ด้วยวิธีใดวิธีหนึ่ง วิธีนี้จะหลีกเลี่ยงการโกหกคอมไพล์ (และเก็บประวัติ) แต่รู้สึกว่า Feature_N จะยุ่งยากในการรวมเพราะฉันจะได้บอกอาจารย์แล้วว่าการเปลี่ยนแปลงจะถูกเปลี่ยนกลับเมื่อฉันกด Feature_1

ฉันพลาดวิธีที่ดีกว่าในการทำเช่นนี้หรือไม่?


person JoeB    schedule 30.10.2014    source แหล่งที่มา


คำตอบ (2)


คำตอบของ @ Michael นั้นเป็นสิ่งที่ดีถ้าการคอมมิตของคุณเป็นการคอมมิตแบบฟีเจอร์เดียวที่ไม่แบ่งปันการพึ่งพากับการคอมมิตสำหรับฟีเจอร์อื่น ๆ หากคุณผสมผสานคุณสมบัติทั้งสองเข้าด้วยกันในการคอมมิตใดๆ คุณจะต้องการ รีเบสแบบโต้ตอบ ช่วยให้คุณสามารถแจกจ่ายการเปลี่ยนแปลงและกำหนดขอบเขตได้ตามใจชอบ และติดตามว่ากลุ่มใดบ้างที่ยังไม่ได้กำหนดให้กับสาขาปัจจุบัน

หากบางครั้งการเปลี่ยนแปลงฟีเจอร์ถูกรวมเข้าเป็น Commit และไม่มีการพึ่งพาข้ามฟีเจอร์ เพื่อให้ชีวิตง่ายขึ้น ความพยายามครั้งแรกของฉันคือ git rebase -i master prototype แบ่งการ Commit แบบผสม ๆ ออกเป็นสอง Commit หนึ่งอันสำหรับแต่ละอัน จากนั้นปิดท้ายด้วย เชอร์รี่หยิบตามคำตอบของไมเคิล ที่ให้ไว้

A1-B2-C12-D2-E1-F12    prototype

โดยที่ตัวเลขบ่งบอกว่าฟีเจอร์ใดที่การคอมมิตมีโค้ดสำหรับ `git rebase -i masterต้นแบบที่คุณต้องการแก้ไขคอมมิต C12 และ F12

pick A1
pick B2
edit C12
pick D2
pick E1
edit F12

(ใช้แฮชของแต่ละคอมมิตแทนแท็กภาพประกอบที่นี่)

Rebase จะหยุดลงหลังจากคอมมิต C12 และคุณสามารถ git reset HEAD~ จากนั้น git add --patch เพื่อใช้ฟีเจอร์-1 hunks ทั้งหมด git commit เพื่อสร้างคอมมิต C1 โดยที่ C12 เคยเป็น จากนั้น git commit -a เพื่อใช้ส่วนที่เหลือทั้งหมดและสร้างคอมมิต C2 ตามมา คุณจะจบลงด้วย

A1-B1-C1-C2-D2-E1-F1-F2

จากนั้นคุณสามารถ git checkout -b feature1 master; git cherry-pick A1 B1 C1 E1 F1 และในทำนองเดียวกันสำหรับฟีเจอร์ 2

ในสถานการณ์ที่ซับซ้อนมากขึ้น วิธีการนี้ ยังคง ใช้งานได้โดยมีการเปลี่ยนแปลงเพียงเล็กน้อยเท่านั้น การรีเบสเชิงโต้ตอบนั้นดีกว่าที่กล่าวมาข้างต้นมากอาจทำให้คุณเชื่อ แต่วิธีที่ดีที่สุดในการค้นหาสิ่งนั้นคือการนั่งลงกับ manpage ขณะที่คุณเข้าไปข้างในและแย่งชิงกลุ่มใหญ่เพื่อความสนุกสนาน ทำอย่างนั้น และในไม่ช้ามันอาจถึงจุดที่การทำเช่นนี้ในฐานะพิธีกรรมก่อนตีพิมพ์มักจะสะดวกกว่าการพยายามทำให้ขั้นตอนการทำงานจริงของคุณเผยแพร่ได้ในทุกขั้นตอนเล็กๆ น้อยๆ

person jthill    schedule 30.10.2014
comment
ถ้าคุณทำ git reset HEAD~ คุณจะต้องทำ git commit ปกติ (โดยไม่มี --amend) หลังจากนั้นเพื่อสร้างคอมมิตใหม่ C1 มิฉะนั้น git commit --amend จะแก้ไข (แก้ไข) การคอมมิตก่อนหน้า (B2 ในตัวอย่างนี้) และคุณจะได้ผลลัพธ์เป็น ...-B12-C2-... หรือคุณสามารถรีเซ็ตไฟล์เพียงไฟล์เดียวด้วย git reset HEAD~ /path/to/file ซึ่งจะปล่อยให้คอมมิตที่เหลือยังคงอยู่ ดังนั้นคุณจึงสามารถแก้ไขได้ด้วย git commit --amend - person iliis; 03.02.2021
comment
@iliis ถูกต้องแล้ว มันควรเป็น git read-tree @~ แทนที่จะเป็น git reset @~ หรือธรรมดา git commit แทนที่จะเป็น git commit --amend ขอบคุณที่ชี้ให้เห็นสิ่งนี้ แก้ไขแล้ว - person jthill; 03.02.2021

สร้างสองสาขา feature_1 และ feature_2 จาก master และเชอร์รี่เลือกคอมมิตจาก prototype ในสาขาคุณลักษณะที่เกี่ยวข้อง:

git checkout -b feature_1 master
git cherry-pick <commit>
git cherry-pick <commit>
…

git checkout -b feature_2 master
git cherry feature_1 prototype | grep "^+" | cut -c3- | xargs git cherry-pick

บรรทัดสุดท้าย cherry เลือกคอมมิตทั้งหมดจาก prototype ซึ่งไม่อยู่ใน feature_1 ไปยังสาขาปัจจุบัน เช่น feature_2

เมื่อคุณพบข้อขัดแย้ง ให้ใช้ git status เพื่อดูคำแนะนำในการดำเนินการต่อ

ดู git-cherry-pick สำหรับเอกสารประกอบเพิ่มเติม

person Michael    schedule 30.10.2014
comment
จริงๆ แล้วเราก็คิดเรื่องเชอร์รี่เด็ดมาเหมือนกัน ตอนที่คุยกันที่นี่ ฉันจะลองดู - person JoeB; 30.10.2014
comment
มีวิธีการทำเช่นนี้หรือไม่หากยังไม่มีการเปลี่ยนแปลงใด ๆ - person Michael; 06.02.2018
comment
สร้างสาขาใหม่ ใช้ git add --patch เพื่อเพิ่มการเปลี่ยนแปลงที่คุณต้องการให้มีในสาขานี้ (+ git add สำหรับไฟล์ใหม่) คอมมิต ซ่อนการเปลี่ยนแปลงที่เหลือ ชำระเงินสาขาใหม่ตามต้นแบบ (git checkout -b feature_2 master) เพิ่มและคอมมิตการเปลี่ยนแปลงของคุณ - person Michael; 07.02.2018