เวลาที่เหมาะสมในการลบสาขาฟีเจอร์คอมไพล์คือเมื่อใด


90

ฉันไม่ต้องการที่จะลงเอยด้วยสาขาคุณลักษณะ 82 สาขาที่ห้อยอยู่รอบ ๆดังนั้นฉันจึงสงสัยว่าข้อเสียที่อาจเกิดขึ้นคืออะไรเพียงแค่ลบสาขาคุณลักษณะทันทีที่ฉันรวมเข้าด้วยกัน

เวิร์กโฟลว์:

git co -b feat-xyz
hack hack
git ci
hack some more
git ci
git co master
git merge feat-xyz
smoke test
git br -d feat-xyz

ปัญหาใด ๆ ที่นี่?


1
ฉันจะบอกว่าไม่มีปัญหาเพราะถ้าคุณต้องการจริงๆคุณสามารถคืนชีพสาขาที่ถูกลบได้ในภายหลัง
slebetman

@slebetman เท่าที่ฉันรู้ว่าสาขาที่ถูกลบไม่สามารถคืนชีพได้ อย่างไรก็ตามหากสาขานั้นถูกรวมเข้าด้วยกันอย่างสมบูรณ์ก่อนที่จะลบสาขานั้นก็ไม่ควรมีความต้องการสาขาอีกต่อไป
Simeon

1
@Simeon ใช่คุณทำได้ Git จะไม่ลบการกระทำดังนั้นเมื่อคุณลบสาขาของคุณคุณก็แค่ลบชื่อนั้น ในการคืนชีพสาขาที่ถูกลบคุณต้องจำสิ่งสุดท้ายที่คุณตกลงกับสาขานั้นและคุณสามารถค้นหาgit reflogได้ จากนั้นชำระเงินแฮช
slebetman

@slebetman ที่จะเป็นจริงก็ต่อเมื่อสาขานั้นถูกรวมเข้าด้วยกัน หากการกระทำนั้นถูกทิ้งไว้ในที่สุดก็จะไม่สามารถเข้าถึงได้และจะถูกเก็บรวบรวมขยะหลังจากระยะเวลาหนึ่ง แม้รายการใน reflog จะถูกลบออกไปในที่สุดคุณมีเวลาประมาณ 90 วันตามค่าเริ่มต้น
goldenratio

@goldenratio: การอ้างอิงใด ๆ ?
slebetman

คำตอบ:


63

ลบหลังจากผสานเป็นวิธีปกติ นี่คือเหตุผลที่git branch -d yourbranchnameตรวจสอบเพื่อให้แน่ใจว่าสาขาถูกรวมเข้าด้วยกันอย่างสมบูรณ์ก่อนที่จะลบ

มีเหตุผลบางประการที่ฉันคิดว่าจะรักษาสาขาไว้รอบ ๆ : คุณอาจต้องการยึดไว้ในกรณีที่คุณมีข้อบกพร่องกลับมาอีกครั้งเมื่อมีการผลิตหรือคุณอาจต้องการบันทึกในอดีต

ไม่ว่าในกรณีใดคุณมีตัวเลือกในการแท็กส่วนหัวของสาขาก่อนที่จะลบออก แท็กเปรียบเสมือนสาขาที่เป็นตัวชี้ไปยังการคอมมิตยกเว้นความแตกต่างเล็กน้อย: 1) พอร์ซเลนมักจะไม่แสดงแท็กในคำสั่งการสำรวจเช่น git show-branch หรือ tab-auto complete ในการชำระเงิน 2) การตรวจสอบอย่างใดอย่างหนึ่งจะทำให้คุณอยู่ใน HEAD ที่แยกออก (ไม่อ้างอิง) 3) คุณสามารถทิ้ง " ข้อความการแท็ก " ไว้ได้ซึ่งทำให้แท็กถูกบันทึกเป็นวัตถุในที่เก็บอ็อบเจ็กต์เหมือนคอมมิต

วิธีนี้ช่วยให้คุณสามารถเก็บรักษาประวัติและหากคุณจำเป็นต้องแก้ไขข้อบกพร่องฉันขอแนะนำให้สร้างสาขาใหม่จากต้นแบบสำหรับการแก้ไข


1
การตรวจสอบแท็กจะตั้งค่า HEAD แต่ไม่ได้สร้างสาขาโดยอัตโนมัติ HEAD ในการกระทำที่ไม่มีสาขาคือสิ่งที่ทำให้มันแยกออกจากกัน
Binarian

1
คุณพูดถูกมันตั้ง HEAD เป็นรหัสคอมมิตแทนที่จะเป็น ref OP ส่วนนั้นไม่ถูกต้อง ฉันควรปรับปรุงมัน
masonk

97

ฉันลบหลังจากผสาน แต่ฉันมักจะทำ a git merge --no-ffเพื่อหลีกเลี่ยงการส่งต่ออย่างรวดเร็วเพื่อให้สามารถมองเห็นประวัติสาขาบนกราฟได้ ฉันชอบที่จะมีประวัติว่าสาขาคุณลักษณะออกจากสาขาการพัฒนาไปที่ใดและกลับเข้ามาที่ใด:

การรวมโดยมีหรือไม่มีการส่งต่ออย่างรวดเร็ว

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


นี่เป็นอีกวิธีที่ดีในการรักษาประวัติศาสตร์เนื่องจากคุณสามารถเลือกคอมมิตที่เข้าถึงได้จากฟีเจอร์นี้ แต่ไม่ใช่จากมาสเตอร์: rev ^ 1..rev ^ 2 ด้านล่างคือสกรูขึ้น rebasing ใด ๆ ที่คุณอาจต้องการทำจากสาขาหลักของคุณ (เช่นหากคุณต้องการให้ต้นแบบ rebased บนรีโมทอัปสตรีมซึ่งเป็นเรื่องปกติมาก)
masonk

1
ฉันไม่ได้มีปัญหานั้น ทีมของเราซิงค์ผ่าน github และโดยปกติฉันไม่จำเป็นต้อง rebase แต่ฉันไม่คิดว่ามันเป็นข้อเสียที่นี่ แม้ว่าคุณจะปรับฐานสาขาการพัฒนาและคุณลักษณะใหม่ แต่การแยกสาขาจะยังคงปรากฏให้เห็นบนกราฟและสิ่งที่สำคัญคือสิ่งที่อยู่ในสาขาคุณลักษณะที่สัมพันธ์กับการพัฒนาไม่ใช่ข้อผูกพันที่คุณจากไปเมื่อคุณสร้างสาขานั้น
lkraider

@Ikraider ขอบคุณสำหรับการแจ้งเตือน ฉันเห็นบทความนั้นเมื่อฉันเรียนรู้คอมไพล์ครั้งแรกตอนนี้มันสมเหตุสมผลกับฉันมากขึ้น ฉันปรับฐานสาขาคุณลักษณะของฉันใหม่ แต่ฉันmerge --no-ffกลับไปเป็นผู้เชี่ยวชาญเพราะอย่างที่คุณบอกว่าคุณสามารถดูประวัติได้
bstpierre

7

ฉันนึกถึงเหตุผลสองประการที่คุณอาจต้องการคงสาขาคุณลักษณะไว้สักหน่อย:

  • มีโอกาสที่จะกลับมาหาคุณสำหรับการทำงานมากขึ้นโดยต้นน้ำ
  • นักพัฒนาคนอื่น ๆ อาจต้องการคุณสมบัตินั้นโดยไม่ต้องการสิ่งอื่นใดเป็นหลัก

ในทางปฏิบัติส่วนใหญ่แล้วการลบเวลาหลังจากผสานก็ทำได้ดี


6

ขั้นตอนการทำงานโดยทั่วไปจะเป็น

 // Create new branch
 $ git checkout -b myfeature
 // and then do some changes and commit them

 // Switch to master branch
 $ git checkout master

 // Merge myfeature to master. --no-ff will always keep branch information.
 $ git merge --no-ff myfeature

 // Delete myfeature branch
 $ git branch -d myfeature

 // Push the changes
 $ git push origin master

1

ฉันคิดว่าเป็นเวิร์กโฟลว์ทั่วไป (ลบหลังจากผสาน)

แก้ไขดังนั้นแทนที่จะรวมอย่างน้อยสำหรับสาขาที่มีอายุสั้นฉันคิดว่าแนวคิดคือการตั้งฐานใหม่ให้กับต้นแบบ จากนั้นคุณจะได้รับประวัติการเปลี่ยนแปลงเชิงเส้นและสาขาทั้งหมดจะกลายเป็นส่วนหนึ่งของลำต้นหลัก ในกรณีนี้คุณมีการเปลี่ยนแปลงทั้งหมดดังนั้นคุณจึงไม่จำเป็นต้องใช้สำเนา


ดังนั้นจึงไม่มีจุดที่จะรักษาสาขาไว้ใช่ไหม?
bstpierre

1
ขอแนะนำอย่างยิ่งให้หลีกเลี่ยง "rebase" โดยทั่วไปการต่อใหม่เป็นอันตรายมีประโยชน์ในบางกรณีเท่านั้น
Dietrich Epp

9
Rebasing เป็นเวิร์กโฟลว์ที่เหมาะสมอย่างยิ่งสำหรับสาขาในพื้นที่และส่วนตัวของคุณ เป็นเรื่องปกติมากที่จะซิงค์กับงานต้นน้ำโดยการ rebasing เช่น ("rebasing down ") เป็นเรื่องปกติน้อยกว่ามากและมักจะเป็นอันตรายในการสร้างฐานใหม่ * คำตอบของข้อที่สองไม่สมเหตุสมผลนักเพราะไม่ว่าคุณจะทำการเปลี่ยนใหม่หรือรวมเข้ากับการเปลี่ยนแปลงต้นน้ำคุณยังคงต้องผลักดันสิ่งนั้น "ขึ้น" อย่างใด แม้ในสาขาในพื้นที่ของคุณคุณจะต้องรวมคุณลักษณะของคุณเพื่อให้เชี่ยวชาญในบางจุด ข้อดีของการใช้คุณลักษณะของคุณใหม่คือการผสานนี้จะกลายเป็นไปข้างหน้าอย่างรวดเร็ว
masonk

1
มีบางอย่างที่ต้องระวังสำหรับการลดทอนสาขาซึ่งทำให้ฉันเมื่อไม่นานมานี้ ตอนนี้เห็นได้ชัดแล้ว แต่ฉันใช้เวลาหลายเดือนในสาขาที่มีอายุยืนยาวโดยมักจะตำหนิเรื่องทั้งหมดกับอาจารย์ มันจบลงด้วยการกระทำที่ดีและละเอียดอ่อนประมาณ 600 ครั้ง แต่อาจารย์ได้รับการปรับโครงสร้างใหม่อย่างมากและมีการเปลี่ยนแปลงทั้งหมดประมาณหลายครั้ง ด้วยการเปลี่ยนสาขาทั้งหมดทุกครั้งฉันได้ตัดการกระทำที่เก่ากว่าออกจากการเชื่อมต่อกับการกระทำหลักที่เหมาะสมกับพวกเขา ตอนนี้ฉันชอบที่จะรวมเป็นหลักเมื่อจำเป็น ฉันจะตั้งฐานใหม่ก็ต่อเมื่อประวัติของสาขาจะไม่ได้รับผลกระทบอย่างแน่นอน
Gary Fixler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.